java.lang.NoSuchFieldError:DEF_CONTENT_CHARSET

liv*_*hak 9 java jvm onos

我试图运行一个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)
Run Code Online (Sandbox Code Playgroud)

现在我添加到类路径的文件如下.

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
Run Code Online (Sandbox Code Playgroud)

"main"java.lang.NoSuchFieldError:DEF_CONTENT_CHARSET的原因是什么

我下载了,http-core-4.1-alpha因为这是org/apache/http/params/SyncBasicHttpParams class来自findjar.com 的jar .那个版本的http-core是不可协商的.我如何找到与该版本的http-core兼容的httpclient版本?

Jon*_*eet 16

你的类路径中有两个不同版本的httpcore:

~/.m2/repository/org/apache/httpcomponents/httpcore/4.0.1/httpcore-4.0.1.jar
~/ms_thesis/ONOS/httpcore-4.1.jar
Run Code Online (Sandbox Code Playgroud)

...虽然第二个实际上是CLASSPAHT根据你的问题导出的.我们也不知道你的lib目录中有什么- 可能还有更多的版本.

还有两个版本的httpclient,除了一个被注释掉.我建议你对所有这些进行排序,以便你使用两个库的最新版本.我的猜测是实际被拾取的是一个版本的httpclient和一个版本的httpcore,它们是不兼容的.要么就是这样,要么只是在httpcore中,从一个jar文件中拾取一些清单条目,但是当一个类被要求它获取另一个时.

无论哪种方式,一次在类路径中拥有相同库的两个版本简直是个坏主意.

您还应该确保您使用的httpcore版本适合您使用的httpclient版本.例如,我刚刚下载了最新版本的httpclient(4.2.5),它使用的是httpcore 4.2.4.如果您尝试将httpclient-4.2与httpcore-4.1一起使用,则可能不兼容.

  • @ liv2hak:SyncBasicHttpParams也在httpcore-4.2.4.jar中 - 因此根本不需要使用*alpha*jar文件. (2认同)