![](/img/trans.png)
[英]java.lang.NoSuchFieldError: org.apache.http.message.BasicLineFormatter.INSTANCE from Mashape Unirest in Java application
[英]NoSuchFieldError INSTANCE at org.apache.http.impl.io.DefaultHttpRequestWriterFactory
java version "1.7.0_71"
Gradle 2.1
你好,
UPDATE:
依賴關系
gradle dependencies | grep httpcore
| +--- org.apache.httpcomponents:httpcore:4.3.3
| +--- org.apache.httpcomponents:httpcore:4.3.3
| +--- org.apache.httpcomponents:httpcore:4.3.3
| +--- org.apache.httpcomponents:httpcore:4.3.3
| | | | | +--- org.apache.httpcomponents:httpcore:4.1 -> 4.3.3
| +--- org.apache.httpcomponents:httpcore:4.3.3
| | | | | +--- org.apache.httpcomponents:httpcore:4.1 -> 4.3.3
這是否意味着我有4.1這是4.3.3的軟鏈接? 看起來很奇怪,因為當我打印出類加載器正在加載它時,似乎加載4.3.3: /home/steve/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.3.3/f91b7a4aadc5cf486df6e4634748d7dd7a73f06d/httpcore-4.3.3.jar
似乎很奇怪。
當我嘗試運行我的httpClient時,我不斷收到此錯誤。 一切都編好了。
java.lang.NoSuchFieldError: INSTANCE
at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.java:52
我的代碼非常簡單,刪除了不重要的代碼以保持它的小:
public class GenieClient {
private CloseableHttpClient mClient;
public GenieClient() {
ClassLoader classLoader = GenieClient.class.getClassLoader();
URL resource = classLoader.getResource("org/apache/http/message/BasicLineFormatter.class");
log.log(Level.INFO, "resource: " + resource);
mClient = HttpClientBuilder.create().build();
}
public int sendRequest() {
int responseCode = -1;
try {
HttpResponse response = mClient.execute(new HttpPost("http://www.google.com"));
responseCode = response.getStatusLine().getStatusCode();
}
catch(IOException ex) {
log.log(Level.SEVERE, "IOException: " + ex.getMessage());
}
return responseCode;
}
}
我從classLoader獲得的輸出是這樣的:
INFO: resource: jar:file:/home/steve/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.3.3/f91b7a4aadc5cf486df6e4634748d7dd7a73f06d/httpcore-4.3.3.jar!/org/apache/http/message/BasicLineFormatter.class
我使用gradle作為我的構建工具,並在我的build.gradle
文件中設置了這樣的依賴build.gradle
:
dependencies {
compile 'org.apache.httpcomponents:httpclient:4.3.6'
}
我也嘗試包含以下httpcore,但仍然得到相同的錯誤:
compile 'org.apache.httpcomponents:httpcore:4.4'
一切都建立好,只有當我運行我的httpClient時,
非常感謝任何建議,
使用-verbose:class啟動你的jvm,它將顯示從哪里加載哪個類。
我過去在兩個場景中遇到過這樣的問題:
您正在加載的其中一個jar有一個帶有Classpath子句的清單,該子句引用了不正確的httpcore版本。
你在一個帶有自己的類加載器的容器(tomcat或sth)中運行,並且某些類例如由來自不同jar的容器加載。
我也不認為您的代碼顯示該類的資源,因為它顯式使用GenieClient的類加載器。 可能使用BasicLineFormatter.class.getClassloader()
會產生不同的結果。 但最好嘗試使用-verbose:class
。
org.apache.httpcomponents:httpcore:4.1 -> 4.3.3
表示4.1
是請求的版本,通過沖突解決解析為4.3.3
。 執行像gradle -q dependencyInsight --configuration compile --dependency httpcore
可以讓你更深入地了解這一點。
您應該檢查構建輸出,並查看實際與您的應用程序一起打包的jar。 此外,使用一些文件管理器通過構建輸出(當然包括檔案)運行BasicLineFormatter.class
搜索,這應該給你一個明確的答案,什么罐包含這個類的什么版本。
如果只有一個版本(4.3.3),則必須表示另一個版本來自運行應用程序的容器。 解決這個問題的方法取決於容器。
如果找到多個版本,可以嘗試在項目中全局排除傳遞依賴關系到httpcore
( 用戶指南的第51.4.7節)。
如果為特定配置定義排除,則在解析此配置或任何繼承配置時,將針對所有依賴項篩選排除的傳遞依賴關系。
顯然,類路徑上有一些舊版本的BasicLineFormatter
,它具有DEFAULT
字段而不是INSTANCE
。 見例如 。
但是你的類加載器報告你正在使用httpcore-4.3.3,你的Gradle依賴樹支持它。
所以看起來你有一些其他的JAR里面有舊版本的BasicLineFormatter
。 您可能需要查看依賴項JAR,然后查看它是否在那里。 嘗試一下jar tf *.jar | grep 'BasicLineFormatter'
jar tf *.jar | grep 'BasicLineFormatter'
可以查看可能涉及的JAR。
此外,這可能是相關的。 我看了你的標簽,似乎你做了一些Android開發。 因此,以下Stack Overflow 問題可能會引起關注:
即使這不是確切的問題,它也會顯示即使你有正確的httpcore依賴關系,你也可能會有一個舊的BasicLineFormatter
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.