2013-08-15 50 views
7

Tôi đang cố gắng chạy một chương trình java và tôi nhận được lỗi thời gian chạy sau. Lỗi được hiển thị bên dưới.java.lang.NoSuchFieldError: DEF_CONTENT_CHARSET

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) 

Bây giờ các tệp mà tôi đã thêm vào đường dẫn lớp như sau.

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 

lý do "chính" java.lang.NoSuchFieldError là gì: DEF_CONTENT_CHARSET

tôi tải http-core-4.1-alpha như đó là bình chứa org/apache/http/params/SyncBasicHttpParams class từ findjar.com. Vì vậy, phiên bản của lõi http không thể thương lượng. Làm thế nào để tôi tìm ra phiên bản httpclient tương thích với phiên bản của lõi http?

+2

Bạn có hai phiên bản 'httpclient' và' httpcore' trong classpath. Có lẽ bạn nên gỡ bỏ các phiên bản cũ (từ kho lưu trữ maven). – aim

Trả lời

12

Bạn đã có hai phiên bản khác nhau của httpcore trong classpath của bạn:

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

... mặc dù điều thứ hai là thực tế xuất khẩu như CLASSPAHT theo câu hỏi của bạn. Chúng tôi cũng không biết những gì trong thư mục lib của bạn - thậm chí có thể có thêm nhiều hơn phiên bản xung quanh.

Cũng sẽ có hai phiên bản của httpclient, ngoại trừ một phiên bản được nhận xét. Tôi khuyên bạn nên sắp xếp tất cả điều này để bạn chỉ có chỉ sử dụng các phiên bản mới nhất của cả hai thư viện. Tôi đoán là những gì thực sự được chọn là một phiên bản của httpclient và một phiên bản của httpcore và chúng không tương thích. Hoặc là, hoặc chỉ trong httpcore có một số mục nhập biểu hiện được chọn từ một tệp jar, nhưng sau đó khi một lớp được yêu cầu cho nó nhận được khác.

Dù bằng cách nào, có hai phiên bản của cùng một thư viện trong đường dẫn lớp học của bạn tại một thời điểm đơn giản là một ý tưởng tồi.

Bạn cũng nên đảm bảo rằng phiên bản httpcore mà bạn sử dụng phù hợp với phiên bản httpclient bạn sử dụng. Ví dụ, tôi vừa tải xuống phiên bản mới nhất của httpclient (4.2.5) và nó sử dụng httpcore 4.2.4. Nếu bạn đang cố gắng sử dụng httpclient-4.2 với httpcore-4.1, điều đó có thể không tương thích.

+0

Vui lòng xem các bình luận cập nhật ở trên. – liv2hak

+1

@ liv2hak: SyncBasicHttpParams cũng nằm trong httpcore-4.2.4.jar - vì vậy không cần sử dụng tệp jar * alpha * nào cả. –

+0

cảm ơn câu trả lời. tôi cũng đã thêm hai phiên bản khác nhau của httpcore. – MacDaddy