2016-11-24 163 views
-1

我已经使用Spring和Apache HTTPComponents编写了一个简单的Java HTTP客户端应用程序。当我运行它,它失败例外:为什么HttpClient需要httpasyncclient?

java.lang.NoClassDefFoundError: org/apache/http/nio/client/HttpAsyncClient 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    at my.package.<init>(MyClientTest.java:60) 

该行的代码是:

<dependency> 
     <groupId>org.apache.httpcomponents</groupId> 
     <artifactId>httpasyncclient</artifactId> 
     <version>4.1.2</version> 
     <scope>test</scope> 
    </dependency> 

private final RestTemplate restTemplate = 
    new RestTemplate(new HttpComponentsAsyncClientHttpRequestFactory()); 

我可以添加依赖于我的生成治愈这种

但为什么我需要这样做?我没有做任何明确异步的事情。我认为Maven应该自动引入必要的依赖关系。

+0

@KlausGroenbaek作为企业编码员,我在这件事上没有多少选择。但它不会造成我们任何重大问题。 – slim

+0

对密切的选民 - 我添加了这个问答,因为我花了半天的时间找到问题,并希望SO有答案。很多人在其他地方也问过类似的问题,只是得到了答案,他们应该在类路径中获得异步jar。我怀疑在大多数情况下,他们并不真的需要它。 – slim

+0

您可以发布整个堆栈跟踪,当发生此问题时,您将加载哪个类。 –

回答

-1

检查您是否不小心问一个异步请求的工厂 - 例如:

private final RestTemplate restTemplate = 
    new RestTemplate(new HttpComponentsAsyncClientHttpRequestFactory()); 

当我遇到了这一点,IDE自动完成给我HttpComponentsAsyncClientHttpRequestFactory - 大概是因为它涉及HttpComponentsClientHttpRequestFactory之前按字母顺序,和我看起来不够仔细,看到Async藏在那里。

HttpComponentsAsyncClientHttpRequestFactory是Spring的一部分,并且对Apache的HttpAsyncClient有运行时依赖关系。

如果您改为使用HttpComponentsClientHttpRequestFactory,则不需要httpasyncclient罐子。