2013-08-15 14 views
7

Próbuję uruchomić program java i otrzymuję następujący błąd czasu wykonywania. Błąd jest pokazany poniżej.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) 

Teraz pliki, które dodałem do ścieżki klas są następujące.

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 

Co jest powodem "głównym" java.lang.NoSuchFieldError: DEF_CONTENT_CHARSET

Pobrałem http-core-4.1-alpha jako że jest słoik, który zawiera org/apache/http/params/SyncBasicHttpParams class z findjar.com. Tak więc ta wersja jądra http nie podlega negocjacji. Jak mogę znaleźć wersję httpclient, która jest kompatybilna z tą wersją http-core?

+2

Dwie wersje 'httpclient' i' httpcore' w ścieżce klas. Prawdopodobnie powinieneś usunąć stare wersje (z repozytorium maven). – aim

Odpowiedz

12

Masz dwie różne wersje httpcore w ścieżce klas:

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

... chociaż druga jest faktycznie wywożone CLASSPAHT według Twojego pytania. Nie wiemy również, co znajduje się w twoim katalogu lib - może być nawet więcej wersji.

Istnieją również dwie wersje httpclient, z wyjątkiem jednego jest skomentowana. Sugeruję, abyś posortował to wszystko, abyś był tylko używając najnowszych wersji obu bibliotek. Domyślam się, że to, co jest aktualnie odbierane, to jedna wersja httpclienta i jedna wersja httpcore i nie są one kompatybilne. Albo to, albo tylko w ramach httpcore, jest jakiś manifest, który jest pobierany z jednego pliku jar, ale wtedy, gdy klasa jest proszona o otrzymanie drugiej.

Tak czy inaczej, posiadanie dwóch wersji tej samej biblioteki w danej ścieżce klasowej jest po prostu złym pomysłem.

Należy również upewnić się, że wersja httpcore, której używasz, jest odpowiednia dla używanej wersji klienta http. Na przykład właśnie pobrałem najnowszą wersję httpclient (4.2.5) i używa ona httpcore 4.2.4. Jeśli próbujesz użyć httpclient-4.2 z httpcore-4.1, to może nie być kompatybilny.

+0

Proszę zobaczyć zaktualizowane komentarze powyżej. – liv2hak

+1

@ liv2hak: SyncBasicHttpParams jest również w httpcore-4.2.4.jar - więc nie ma potrzeby używania w ogóle pliku jar * alpha *. –

+0

dzięki za odpowiedź. Dodałem także dwie różne wersje httpcore. – MacDaddy