【问题标题】:HTTPClient Example - Exception in thread "main" java.lang.NoSuchFieldError: INSTANCEHTTPClient 示例 - 线程“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

有什么想法吗?

【问题讨论】:

    标签: java apache-httpclient-4.x


    【解决方案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
                }
                


                希望对你有所帮助~

                【讨论】:

                  猜你喜欢
                  • 2022-11-14
                  • 1970-01-01
                  • 2013-11-30
                  • 1970-01-01
                  • 2013-04-13
                  • 2019-08-21
                  • 2014-09-08
                  • 2020-05-05
                  • 1970-01-01
                  相关资源
                  最近更新 更多