2016-11-24 196 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罐子。