我使用Spring和Apache HTTPComponents编写了一个简单的Java HTTP客户端应用程序。当我运行它时,它失败,例外:
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)
这一行的代码是:
private final RestTemplate restTemplate =
new RestTemplate(new HttpComponentsAsyncClientHttpRequestFactory());
我可以通过在构建中添加依赖项来解决这个问题:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpasyncclient</artifactId>
<version>4.1.2</version>
<scope>test</scope>
</dependency>
但为什么我需要这样做呢?我没有做任何显式异步的事情。我认为Maven应该自动引入必要的依赖。
答案 0 :(得分:-1)
检查您是否有意外请求异步请求工厂 - 例如:
private final RestTemplate restTemplate =
new RestTemplate(new HttpComponentsAsyncClientHttpRequestFactory());
当我遇到这个问题时,IDE自动完成功能给了我HttpComponentsAsyncClientHttpRequestFactory
- 可能是因为它按字母顺序排在HttpComponentsClientHttpRequestFactory
之前,我看起来不够仔细,看不到Async
隐藏在那里
HttpComponentsAsyncClientHttpRequestFactory
是Spring的一部分,并且对Apache的HttpAsyncClient
具有运行时依赖性。
如果您改为使用HttpComponentsClientHttpRequestFactory
,则不需要httpasyncclient
jar。