HTTPClient 示例 - 线程“main”中的异常 java.lang.NoSuchFieldError: INSTANCE

Posted

技术标签:

【中文标题】HTTPClient 示例 - 线程“main”中的异常 java.lang.NoSuchFieldError: INSTANCE【英文标题】:HTTPClient Example - Exception in thread "main" java.lang.NoSuchFieldError: INSTANCE 【发布时间】:2014-04-15 08:48:53 【问题描述】:

我将 Apache 的 HttpClient 组件用于以下简单程序,我看到以下异常:

线程“主”java.lang.NoSuchFieldError 中的异常:实例 在 org.apache.http.impl.io.DefaultHttpRequestWriterFactory.(DefaultHttpRequestWriterFactory.java:52) 在 org.apache.http.impl.io.DefaultHttpRequestWriterFactory.(DefaultHttpRequestWriterFactory.java:56) 在 org.apache.http.impl.io.DefaultHttpRequestWriterFactory.(DefaultHttpRequestWriterFactory.java:46) 在 org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.(ManagedHttpClientConnectionFactory.java:72) 在 org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.(ManagedHttpClientConnectionFactory.java:84) 在 org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.(ManagedHttpClientConnectionFactory.java:59) 在 org.apache.http.impl.conn.PoolingHttpClientConnectionManager$InternalConnectionFactory.(PoolingHttpClientConnectionManager.java:487) 在 org.apache.http.impl.conn.PoolingHttpClientConnectionManager.(PoolingHttpClientConnectionManager.java:147) 在 org.apache.http.impl.conn.PoolingHttpClientConnectionManager.(PoolingHttpClientConnectionManager.java:136) 在 org.apache.http.impl.conn.PoolingHttpClientConnectionManager.(PoolingHttpClientConnectionManager.java:112) 在 org.apache.http.impl.client.HttpClientBuilder.build(HttpClientBuilder.java:726) 在 com.starwood.rms.controller.property.HttpExample.main(HttpExample.java:14) 公共类 HttpExample 公共静态无效主要(字符串[]参数) HttpClient 客户端 = HttpClientBuilder.create().build(); HttpGet 请求 = new HttpGet("https://www.google.com/?q=java"); 尝试 HttpResponse 响应 = client.execute(request); System.out.println(response.getStatusLine()); 捕捉(异常 e) e.printStackTrace();

我正在使用

Httpclient-4.3.3.jar Httpcore-4.3.2.jar

有什么想法吗?

【问题讨论】:

【参考方案1】:

我在使用 Hadoop 时遇到了这个问题。它在共享库中使用了旧版本的 httpclient-4.2.5.jarhttpcore-4.2.5.jar

我通过maven-shade-plugin 对部分进行着色解决了这个问题

<relocations>
    <relocation>
        <pattern>org.apache.http</pattern>
        <shadedPattern>shaded.org.apache.http</shadedPattern>
    </relocation>
</relocations>

【讨论】:

我已经用 SBT 试过这个,但它似乎不起作用。你曾经用 SBT 做过这个吗? 这是唯一适用于我的用例的解决方案。我也在使用Hadoop。 +1! @Havnar 在 SBT 中你应该使用 ExclusionRule 来代替【参考方案2】:

看DefaultHttpRequestWriterFactory的源码

package org.apache.http.impl.io;

import org.apache.http.HttpRequest;
import org.apache.http.annotation.Immutable;
import org.apache.http.io.HttpMessageWriter;
import org.apache.http.io.HttpMessageWriterFactory;
import org.apache.http.io.SessionOutputBuffer;
import org.apache.http.message.BasicLineFormatter;
import org.apache.http.message.LineFormatter;

@Immutable

public class  [More ...] DefaultHttpRequestWriterFactory implements HttpMessageWriterFactory<HttpRequest> 

    public static final DefaultHttpRequestWriterFactory INSTANCE = new DefaultHttpRequestWriterFactory();

    private final LineFormatter lineFormatter;

    public  [More ...] DefaultHttpRequestWriterFactory(final LineFormatter lineFormatter) 
        super();
        this.lineFormatter = lineFormatter != null ? lineFormatter : BasicLineFormatter.INSTANCE;
    

    public  [More ...] DefaultHttpRequestWriterFactory() 
        this(null);
    

    public HttpMessageWriter<HttpRequest>  [More ...] create(final SessionOutputBuffer buffer) 
        return new DefaultHttpRequestWriter(buffer, lineFormatter);
    


您确定您使用的是 HttpCore 4.3.2 吗? DefaultHttpRequestWriterFactory尝试解决

BasicLineFormatter.INSTANCE

字段但找不到。

检查您的类路径中可能包含另一个 BasicLineFormatter 类的库,也许您的 HttpCore 来自与 4.3.2 版本冲突的旧版本。

【讨论】:

【参考方案3】:

原因:java.lang.NoSuchFieldError: INSTANCE

java.lang.NoSuchFieldError: INSTANCE 的解决方案之一:如果我们的类路径中有两个不同版本的同一个类,就会发生这种情况……。 […],所以我们首先找到那个类(一个版本的类),点击那个类,选择“构建路径”,然后我们点击“从构建路径中删除”。 by 333ccc333

【讨论】:

【参考方案4】:

我遇到了这个问题。使用 HttpClientBuilder.create().build() 初始化 HttpClient 时似乎出现问题。如果您想要更直接的解决方案,只需使用 new DefaultHttpClient() 来初始化 HttpClient。

HttpClient client = new DefaultHttpClient();

【讨论】:

【参考方案5】:

此代码有效...没有任何错误..如果您使用类似的导入,请检查包。

package com.jai.http;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClientBuilder;

public class HttpExample 

    /**
     * @param args
     */
    public static void main(String[] args) 
        HttpClient client = HttpClientBuilder.create().build();
        HttpGet request = new HttpGet("https://www.google.com/?q=java");
        try 
            HttpResponse response = client.execute(request);
            System.out.println(response.getStatusLine());

         catch (Exception e) 
            e.printStackTrace();

        

    

【讨论】:

是的,它似乎工作正常。我有其他依赖项目,他们使用的是较低版本的 httpcore。我必须启用详细模式来检查 jar 的加载位置并能够解决问题。 你能告诉我们是什么版本的 Httpclient 和 Httpcore 使这段代码有效吗? 对不起,伙计不记得了。应该适用于任何版本。尝试使用最新版本。【参考方案6】:

对于那些使用 Webpshere 的人,请确保您的类加载策略设置为“Parent Last”,否则它将无法正常工作,因为 WAS 正在使用它自己的 commons http 版本,这可能会发生冲突。

【讨论】:

【参考方案7】:

我也遇到了这个问题,我意识到这是当我们升级到 java 1.8 时,我刚刚降级到 1.7 并按预期工作。 不知道为什么版本会成为问题。

【讨论】:

【参考方案8】:

我也对这个和 Eclipse 感到沮丧,直到我意识到类似于 Pat B 的 Webpshere 提示,如果您的依赖关系顺序错误,它确实会导致 Eclipse 出现问题。

Properties -&gt; Java Build Path -&gt; Order and Export

按照核心和客户端的顺序在这里玩一下。

【讨论】:

【参考方案9】:

我也有这个错误,在我的类路径中 我有 httpclient-4.4.1.jarhttpcore-4.4.1.jar 但是,出于某种原因,类加载器加载了类org.apache.http.message.BasicLineFormatterhttpcore-4.0.jar 位于意外位置并导致此错误 您可以使用下面的代码来检查它正在使用哪个 jar

try
Class cls=Class.forName('org.apache.http.message.BasicLineFormatter');
  println cls.getProtectionDomain().getCodeSource().getLocation();
catch (Error ex)
  println ex

希望对你有所帮助~

【讨论】:

以上是关于HTTPClient 示例 - 线程“main”中的异常 java.lang.NoSuchFieldError: INSTANCE的主要内容,如果未能解决你的问题,请参考以下文章

Qt在多线程中使用信号槽的示例

POST 后使用 HttpClient 执行 GET 时出现异常

轻松把玩HttpClient之封装HttpClient工具类,单线程调用及多线程批量调用测试

如何使用 HttpClient 进行多线程操作?

httpclient在并发量较高的调用下问题如何去

可重用的 HttpClient 实例与静态变量(在多个线程中大量使用)?