簡體   English   中英

org.apache.http.impl.io.DefaultHttpRequestWriterFactory中的NoSuchFieldError INSTANCE

[英]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,它將顯示從哪里加載哪個類。

我過去在兩個場景中遇到過這樣的問題:

  1. 您正在加載的其中一個jar有一個帶有Classpath子句的清單,該子句引用了不正確的httpcore版本。

  2. 你在一個帶有自己的類加載器的容器(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 INSTANCE in 4.3-beta1 鏈接鏈接中獲得了靜態INSTANCE in 4.3-beta1

顯然,類路徑上有一些舊版本的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

  1. 找到比4.3更舊版本的httpcore
  2. 從Referenced Libraries中刪除舊版本的httpcore jar。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM