9

Java プログラムを実行しようとすると、次の実行時エラーが発生します。エラーを以下に示します。

Exception in thread "main" java.lang.NoSuchFieldError: DEF_CONTENT_CHARSET
    at org.apache.http.impl.client.DefaultHttpClient.setDefaultHttpParams(DefaultHttpClient.java:175)
    at org.apache.http.impl.client.DefaultHttpClient.createHttpParams(DefaultHttpClient.java:158)
    at org.apache.http.impl.client.AbstractHttpClient.getParams(AbstractHttpClient.java:448)
    at org.apache.http.impl.client.AbstractHttpClient.createClientConnectionManager(AbstractHttpClient.java:309)
    at org.apache.http.impl.client.AbstractHttpClient.getConnectionManager(AbstractHttpClient.java:466)
    at org.apache.http.impl.client.AbstractHttpClient.createHttpContext(AbstractHttpClient.java:286)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:851)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:784)
    at net.floodlightcontroller.core.internal.PacketStreamerClient.registerForPackets(PacketStreamerClient.java:90)
    at net.floodlightcontroller.core.internal.PacketStreamerClient.main(PacketStreamerClient.java:51)

クラスパスに追加したファイルは次のとおりです。

export CLASSPATH=$(JARS=(./lib/*.jar); IFS=:; echo "${JARS[*]}")
export CLASSPATH=$CLASSPATH:~/.m2/repository/org/apache/httpcomponents/httpclient/4.0.1/httpclient-4.0.1.jar
export CLASSPATH=$CLASSPATH:~/.m2/repository/org/apache/httpcomponents/httpcore/4.0.1/httpcore-4.0.1.jar
export CLASSPATH=$CLASSPATH:~/.m2/repository/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar
export CLASSPAHT=$CLASSPATH:~/ms_thesis/ONOS/httpcore-4.1.jar
#export CLASSPATH=$CLASSPATH:~/ms_thesis/ONOS/lib/httpclient-4.2.jar
export CLASSPATH=$CLASSPATH:~/google-gson-2.2.4/gson-2.2.4.jar

「メイン」の java.lang.NoSuchFieldError: DEF_CONTENT_CHARSET の理由は何ですか

それがfindjar.comからhttp-core-4.1-alpha含まれているjarであるため、 ダウンロードしました。org/apache/http/params/SyncBasicHttpParams classしたがって、そのバージョンの http-core は交渉できません。そのバージョンの http-core と互換性のある httpclient のバージョンを確認するにはどうすればよいですか?

4

1 に答える 1

17

クラスパスに httpcore の 2 つの異なるバージョンがあります。

~/.m2/repository/org/apache/httpcomponents/httpcore/4.0.1/httpcore-4.0.1.jar
~/ms_thesis/ONOS/httpcore-4.1.jar

... 2番目のものは実際CLASSPAHTにあなたの質問に従ってエクスポートされますが。libまた、ディレクトリに何があるかもわかりません。さらに多くのバージョンが存在する可能性があります。

httpclient にも 2 つのバージョンがありますが、1 つがコメントアウトされています。両方のライブラリの最新バージョンのみを使用するように、これらすべてを整理することをお勧めします。私の推測では、実際に取り上げられているのは httpclient の 1 つのバージョンと httpcore の 1 つのバージョンであり、それらには互換性がありません。それか、または httpcore 内で、1 つの jar ファイルからいくつかのマニフェスト エントリが取得されますが、クラスが要求されると、もう一方のエントリが取得されます。

いずれにせよ、一度にクラスパスに同じライブラリの 2 つのバージョンを持つことは、単純に悪い考えです。

また、使用する httpcore のバージョンが、使用する httpclient のバージョンに適していることを確認する必要があります。たとえば、httpclient の最新バージョン (4.2.5) をダウンロードしたところ、httpcore 4.2.4 が使用されています。httpclient-4.2 を httpcore-4.1 で使用しようとしている場合、互換性がない可能性があります。

于 2013-08-15T05:57:22.713 に答える