Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/458.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 位于org.apache.http.impl.io.DefaultHttpRequestWriterFactory的NoSuchFieldError实例_Java_Gradle_Apache Httpclient 4.x - Fatal编程技术网

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

Java 位于org.apache.http.impl.io.DefaultHttpRequestWriterFactory的NoSuchFieldError实例,java,gradle,apache-httpclient-4.x,Java,Gradle,Apache Httpclient 4.x,你好, java version "1.7.0_71" Gradle 2.1 依赖关系 UPDATE: 这是否意味着我有4.1,它是4.3.3的软链接?似乎很奇怪,因为当我打印出类加载器正在加载的内容时,它似乎加载了4.3.3:/home/steve/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.3.3/f91b7aadc5cf48df6e46344748d7dd7a73f06d/httpco

你好,

java version "1.7.0_71" 
Gradle 2.1
依赖关系

UPDATE:
这是否意味着我有4.1,它是4.3.3的软链接?似乎很奇怪,因为当我打印出类加载器正在加载的内容时,它似乎加载了4.3.3:
/home/steve/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.3.3/f91b7aadc5cf48df6e46344748d7dd7a73f06d/httpcore-4.3.3.jar
似乎很奇怪

当我试着运行我的httpClient时,我总是遇到这个错误。一切正常

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
我从类加载器获得的输出如下:

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;
    }
}
我使用gradle作为构建工具,并在我的
build.gradle
文件中设置了如下依赖项:

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
我还尝试包括以下httpcore,但仍然得到相同的错误:

dependencies {
    compile 'org.apache.httpcomponents:httpclient:4.3.6'
}
一切正常,只有在我运行httpClient时


非常感谢您的建议,

使用-verbose:class启动jvm,它将显示从何处加载的类

我过去曾在两种情况下遇到过这样的问题:

  • 您正在加载的一个JAR有一个manifest with Classpath子句,它引用了错误版本的httpcore

  • 您正在使用自己的类加载器在某个容器(tomcat或其他)中运行,并且某些类是由容器从不同的jar加载的

  • 我也不认为您的代码显示了类的资源,因为它显式地使用了GenieClient的类加载器。可能使用
    BasicLineFormatter.class.getClassloader()
    会得到不同的结果。
    但是最好尝试使用
    -verbose:class

    显然,在类路径上有一些较旧版本的
    基本格式
    ,其中包含
    默认值
    字段,而不是
    实例
    。看

    但是您的类加载器报告您正在使用httpcore-4.3.3,您的Gradle依赖关系树对此进行了备份

    因此,您似乎还有其他一些JAR,其中包含旧版本的
    basiclineformter
    。您可能需要检查依赖项jar,看看它是否在其中。尝试使用
    jar tf*.jar | grep'basiclineformter'
    查看可能涉及哪些jar

    此外,这可能是相关的。我看了你的标签,似乎你做了一些Android开发。因此,以下堆栈溢出可能会引起关注:


    即使这不是一个确切的问题,它也显示了即使您拥有正确的httpcore依赖项,您也可能会有一个旧的
    BasicLineFormat

    org.apache.httpcomponents:httpcore:4.1->4.3.3
    意味着
    4.1
    是请求的版本,通过冲突解决将其解析为
    4.3.3
    。执行类似于
    gradle-q dependencyInsight--configuration compile--dependency httpcore
    的操作应该会让您对此有更多的了解

    您应该检查构建输出,并查看应用程序中实际打包了哪些JAR。此外,使用一些文件管理器,通过构建输出(当然包括存档)运行对
    BasicLineFormatter.class
    的搜索,这将为您提供一个明确的答案,即什么JAR包含这个类的什么版本

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

    如果您确实找到了多个版本,您可以尝试在项目中全局排除对
    httpcore
    的可传递依赖项(的第51.4.7章)

    如果为特定配置定义排除,则在解析此配置或任何继承配置时,将针对所有依赖项筛选排除的可传递依赖项


    似乎
    basicLineFormat
    在4.3-beta1中获得了它的静态
    实例

  • 查找httpcore,它的版本比4.3旧
  • 从引用的库中删除旧版本的httpcore jar

  • 在依赖关系树中的某个地方,您可能还有一个旧版本的httpcore。
    gradle dependencies
    的输出是什么?能否提供一个完整的、可运行的示例来说明这个问题?classpath中有不同的httpcore版本。试着排除httpcore 4.1,看起来你必须用不同的罐子做两次。19x 500个奖励,1800次重复大约10个其他奖励。。。2009年,据我所知,你可能是唯一一个拥有60枚金徽章、185枚银徽章和320枚棕色徽章的人,在奖金上花了约12000美元——并且拥有327个声誉。。。这是疯狂@ToYonos和vaxquie,嗯,我不确定我做了什么不对,我在他们规章制度的指导方针和政策范围内使用。我已经成为会员很长一段时间了,在这段时间里,我发布了一些问题,并回答了一些问题。500分的奖金是为了给其他成员的支持提供额外的积分。
    dependencies {
        compile 'org.apache.httpcomponents:httpclient:4.3.6'
    }
    
    compile 'org.apache.httpcomponents:httpcore:4.4'