web-dev-qa-db-ja.com

HTTPClientの例-「main」スレッドの例外Java.lang.NoSuchFieldError:INSTANCE

次の単純なプログラムにApacheのHttpClientコンポーネントを使用していますが、次の例外が表示されます。

スレッド「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)
 org.Apache.http.impl.conn.PoolingHttpClientConnectionManager $ InternalConnectionFactory。(PoolingHttpClientConnectionManager.Java:487)
でorg.Apache.http.impl.conn.PoolingHttpClientConnectionManager。(PoolingHt tpClientConnectionManager.Java:147)
 at org.Apache.http.impl.conn.PoolingHttpClientConnectionManager。(PoolingHttpClientConnectionManager.Java:136)
 at org.Apache.http.impl.conn.PoolingHttpClientConnectionManager。( PoolingHttpClientConnectionManager.Java:112)
 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

何か案は?

17
jagamot

このコードは...エラーなしで機能します。同様の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();

        }

    }
}
3
Jay

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>
6
H6.

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がある可能性があります。

6
vzamanillo

原因:Java.lang.NoSuchFieldError:INSTANCE

Java.lang.NoSuchFieldError:INSTANCEの解決策の1つ:これは、クラスパスに同じクラスの2つのdiffバージョンがある場合に発生します…。 […]、そのため、最初にそのクラス(クラスの1つのバージョン)を見つけ、そのクラスをクリックし、「ビルドパス」を選択してから、「ビルドパスから削除」をクリックします。 333ccc333

5
vijay m p

この問題がありました。 HttpClientBuilder.create()。build()でHttpClientを初期化中に問題があるようです。より迅速な解決策が必要な場合は、新しいDefaultHttpClient()を使用してHttpClientを初期化します。

HttpClient client = new DefaultHttpClient();
4

Websphereを使用している場合は、クラスロードポリシーが「Parent Last」に設定されていることを確認してください。設定しないと、WASが独自のバージョンのcommons httpを使用するため競合します。

1
Pat B

私もこの問題を抱えていました。Java 1.8にアップグレードしたとき、1.7にダウングレードしただけで期待どおりに動作します。バージョンが問題になった理由はわかりません。

0
B.J. A.A.

Pat BのWebpshereヒントと同様に、依存関係が間違った順序である場合、Eclipseで問題が発生することに気付くまで、これとEclipseにイライラしていました。

Properties -> Java Build Path -> Order and Export

コアとクライアントの順序でここで少し遊んでください。

0
Tim