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.jar
和 httpcore-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 -> Java Build Path -> Order and Export
按照核心和客户端的顺序在这里玩一下。
【讨论】:
【参考方案9】:我也有这个错误,在我的类路径中
我有 httpclient-4.4.1.jar 和 httpcore-4.4.1.jar
但是,出于某种原因,类加载器加载了类org.apache.http.message.BasicLineFormatter
从 httpcore-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的主要内容,如果未能解决你的问题,请参考以下文章
POST 后使用 HttpClient 执行 GET 时出现异常