2010-07-12 9 views
12

Ich versuche, eine Beispielanwendung von HttpClient 4.0.1 auszuführen. Es ist die Datei ClientMultiThreadedExecution.java aus dem Abschnitt Beispiele. Ich lege diese Dateien in den Klassenpfad: apache-mime4j-0.6.jar; commons-codec-1.3.jar; commons-logging-1.1.1.jar; httpclient-4.0.1.jar; httpcore-4.0.1.jar; httpmime-4.0.1.jar und die Datei kompiliert korrekt. Zur Laufzeit bekomme ich folgenden Fehler:HttpClient NoClassDefFoundError

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/client/methods/HttpUriRequest 
Caused by: java.lang.ClassNotFoundException: org.apache.http.client.methods.HttpUriRequest 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:251) 
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319) 

Fehle ich eine Referenz? Es scheint wie ein Klassenpfadfehler, aber ich kann nicht herausfinden, welche JAR-Datei enthalten ist? Vielen Dank im Voraus für Ihre Hilfe.

Antwort

5

Diese Ausnahme besagt, dass die genannte Klasse im Klassenpfad Laufzeit fehlt.

Je nach Ausführung des Programms gibt es mehrere Möglichkeiten, den Klassenpfad für die Laufzeit anzugeben. Da eine anständige IDE dies alles transparent von Ihren Händen nimmt, wette ich, dass Sie es in einer Eingabeaufforderung ausführen.

Wenn Sie es als JAR-Datei von java.exe -jar oder Doppelklick auf die Datei ausführen, dann müssen Sie den Classpath im Class-Path Eintrag der MANIFEST.MF Datei JAR angeben. Beachten Sie, dass die %CLASSPATH% Umgebungsvariable und -cp und -classpath Argumente sind ignoriert wann immer Sie ein JAR ausführen.

Wenn Sie es als eine "plain vanilla" Java-Anwendung von java.exe ausführen, dann müssen Sie es in der -cp oder -classpath Argument angeben. Beachten Sie, dass bei Verwendung dieses Arguments die Umgebungsvariable %CLASSPATH%ignoriert wird.

In jedem Fall sollte der Klassenpfad aus einer (halb) colonseparated Zeichenfolge von Pfaden zu JAR-Dateien bestehen (entweder absolute Pfade oder relativ zum aktuellen Arbeitsverzeichnis). Z.B.

java -cp .;/path/to/file1.jar;/path/to/file2.jar com.example.MyClass

(wenn Sie auf Unix/Linux sind, verwenden Sie Doppelpunkt statt Semikolon als Pfadtrenn)

5

Diese Klasse ist in httpclient-4.0.1.jar (ich habe es gerade heruntergeladen, um sicher zu sein), also vermute ich, dass Sie es nicht ordnungsgemäß in den Klassenpfad eingefügt haben.

Wie kompilieren Sie und führen Sie Ihren Code aus?

+0

Verwenden von Textpad. Es befindet sich im selben Verzeichnis wie die JAR-Dateien und ich habe dies in der Konfiguration $ Datei -cp.; Apache-mime4j-0.6.jar; commons-codec-1.3.jar; commons-logging-1.1.1.jar; httpclient-4.0.1.jar; httpcore-4.0.1.jar; httpmime-4.0.1.jar Es kompiliert gut, aber nicht ausgeführt. – user389753

-1

Mit Maven dies über Import Umfang durchgeführt werden kann.

0

Als ich dieses Problem erfuhr, stellte sich heraus, dass, als ich die Fluent-API als Maven-Abhängigkeit hinzufügte, eine andere Version der HTTPClient-API als die, die ich bereits verwendete, importierte. Beide Versionen der API wurden in den resultierenden JAR-Lib-Ordner gepackt. Der Versionskonflikt hat diesen Fehler verursacht.

Das Hinzufügen von Einträgen zu Ihrem Klassenpfad wird das Problem beheben, da Sie nur manuell angeben, welche Version verwendet werden soll. Um jedoch das zugrunde liegende Problem zu beheben, musste ich meinen Zielordner vor dem Neuaufbau löschen (oder maven clean ausführen). Dadurch wurden alle zwischengespeicherten Bibliotheks-JARs entfernt, und beim nächsten Build wurde nur das korrekte heruntergeladen.

Hoffe, dass jemand hilft!

1

Running Eclipse Luna 2 (4.4.2) innerhalb cloudera-quickstart-vm-5.8.0 Ich hatte die folgende

  • Apache-Httpcomponents-httpcore.jar
  • Httpclient-4.5.3.jar
  • Httpclient-Cache-4.5.3.jar

hinzuzufügen .. und dann funktionierte es ohne Fehler