NoSuchFieldError 实例位于 org.apache.http.impl.io.DefaultHttpRequestWriterFactory

2024-01-17

java version "1.7.0_71" 
Gradle 2.1

Hello,

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;
    }
}

我从类加载器得到的输出是这样的:

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 file:

dependencies {
    compile 'org.apache.httpcomponents:httpclient:4.3.6'
}

我也尝试过包含以下 httpcore,但仍然收到相同的错误:

compile 'org.apache.httpcomponents:httpcore:4.4'

一切都构建正常,只有当我运行我的 httpClient 时,

非常感谢您的任何建议,


org.apache.httpcomponents:httpcore:4.1 -> 4.3.3 means 4.1是请求的版本,解析为4.3.3通过冲突解决。执行类似的事情gradle -q dependencyInsight --configuration compile --dependency httpcore应该能让你对此有更多的了解。

您应该检查构建输出,并查看您的应用程序实际打包了哪些 jar。另外,使用一些文件管理器运行搜索BasicLineFormatter.class通过构建输出(当然包括档案),这应该给你一个明确的答案,哪些 jar 包含此类的哪个版本。

如果只有一个版本 (4.3.3),则这必定意味着另一个版本来自运行您的应用程序的容器。解决这个问题的方法取决于容器。

如果您确实找到多个版本,您可以尝试排除传递依赖httpcore项目的全球范围内(第 51.4.7 章)用户指南 http://www.gradle.org/docs/current/userguide/dependency_management.html).

如果您为特定配置定义排除,则在解析此配置或任何继承配置时,将为所有依赖项过滤排除的传递依赖项。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NoSuchFieldError 实例位于 org.apache.http.impl.io.DefaultHttpRequestWriterFactory 的相关文章

随机推荐