HTTPClient示例 – 线程“main”中的exceptionjava.lang.NoSuchFieldError:INSTANCE

我正在使用Apache的HttpClient组件来实现以下简单程序,我看到以下exception:

线程“main”中的exceptionjava.lang.NoSuchFieldError:INGANCE at org.apache.http.impl.io.DefaultHttpRequestWriterFactory。(DefaultHttpRequestWriterFactory.java:52)at 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。位于org.apache.http.impl.conn.ManagedHttpClientConnectionFactory。(ManagedHttpClientConnectionFactory.java:59)的orl.apache.http.impl.conn.PoolingHttpClientConnectionManager $ InternalConnectionFactory中的impl.conn.ManagedHttpClientConnectionFactory。(ManagedHttpClientConnectionFactory.java:84)。(PoolingHttpClientConnectionManager) .java:487)org.apache.http.impl.conn.PoolingHttpClientConnectionManager。(PoolingHttpClientConnectionManager.java:147)org.apache.http.impl.conn.PoolingHttpClientConnectionMana  ger。(PoolingHttpClientConnectionManager.java:136)org.apache.http.impl.conn.PoolingHttpClientConnectionManager。(PoolingHttpClientConnectionManager.java:112)atg.apache.http.impl.client.HttpClientBuilder.build(HttpClientBuilder.java:726)在com.starwood.rms.controller.property.HttpExample.main(HttpExample.java:14) 
公共类HttpExample {

     public static void main(String [] args){
         HttpClient客户端= HttpClientBuilder.create()。build();
         HttpGet request = new HttpGet(“https://www.google.com/?q=java”);

        尝试{
             HttpResponse response = client.execute(request);
            的System.out.println(response.getStatusLine());

         } catch(例外e){
             e.printStackTrace();
         }
     }
 }

我在用

  • HttpClient的-4.3.3.jar
  • 的HttpCore-4.3.2.jar

有任何想法吗?

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

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

查看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 { 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 [More ...] create(final SessionOutputBuffer buffer) { return new DefaultHttpRequestWriter(buffer, lineFormatter); } } 

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

 BasicLineFormatter.INSTANCE 

领域但找不到它。

检查你的类路径中是否包含另一个BasicLineFormatter类的库,也许你有一个旧版本的HttpCore与4.3.2版本冲突。

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

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

   org.apache.http shaded.org.apache.http   

引起:java.lang.NoSuchFieldError:INSTANCE

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

我有这个问题。 使用HttpClientBuilder.create()。build()初始化HttpClient时看起来有问题。 如果您想要更直接的解决方案,只需使用新的DefaultHttpClient()来初始化HttpClient。

 HttpClient client = new DefaultHttpClient(); 

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

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