繁体   English   中英

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

[英]HTTPClient Example - Exception in thread “main” java.lang.NoSuchFieldError: INSTANCE

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

Exception in thread "main" java.lang.NoSuchFieldError: INSTANCE
    at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.(DefaultHttpRequestWriterFactory.java:52)
    at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.(DefaultHttpRequestWriterFactory.java:56)
    at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.(DefaultHttpRequestWriterFactory.java:46)
    at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.(ManagedHttpClientConnectionFactory.java:72)
    at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.(ManagedHttpClientConnectionFactory.java:84)
    at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.(ManagedHttpClientConnectionFactory.java:59)
    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager$InternalConnectionFactory.(PoolingHttpClientConnectionManager.java:487)
    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.(PoolingHttpClientConnectionManager.java:147)
    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.(PoolingHttpClientConnectionManager.java:136)
    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.(PoolingHttpClientConnectionManager.java:112)
    at org.apache.http.impl.client.HttpClientBuilder.build(HttpClientBuilder.java:726)
    at com.starwood.rms.controller.property.HttpExample.main(HttpExample.java:14)
public class HttpExample {

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

我在用

  • Httpclient-4.3.3.jar
  • Httpcore-4.3.2.jar

有任何想法吗?

我在使用 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>

查看 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类的库,也许您有一个与 4.3.2 版本冲突的旧版本的 HttpCore。

引起:java.lang.NoSuchFieldError: INSTANCE

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

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

HttpClient client = new DefaultHttpClient();

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

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

        }

    }
}

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

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

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

Properties -> Java Build Path -> Order and Export

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

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

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


希望这有帮助~

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM