Java NoClassDefFoundError trotz gesetztem Klassenpfad

8

Ich habe Probleme damit, eine Java-Anwendung in der Konsole und / oder mit Ant laufen zu lassen. Ich weiß, dass viele Startprobleme damit zusammenhängen, dass der Klassenpfad nicht gesetzt oder falsch gesetzt wurde, obwohl ich mir ziemlich sicher bin, dass ich ihn korrekt eingestellt habe, sodass meine Suche nur Ergebnisse lieferte.

Hier ist das allgemeine Setup meiner Anwendung: Klassen sind in Paketen Modell, Ansicht und Controller. controller.Controller ist die Klasse mit der Hauptmethode. Ich verwende Objektdb als meinen JPA-Provider.

Ich verwende Ant, um meine Anwendung zu kompilieren.

Nach dem Kompilieren kann ich meine Anwendung von ant mit dem folgenden Skript ausführen:

%Vor%

Dabei ist $ {main-class} controller.Controller und classpath bestehen aus den Ordnern / lib und / dist (die JAR-Datei der Anwendung wird nach / dist kompiliert)

Nun habe ich versucht, alle .jar-Dateien aus / lib und / dist in einen separaten Ordner zu kopieren und sie mit java -jar cooking.jar -cp . auszuführen, was zu

führt %Vor%

Also habe ich versucht, ant und leicht modifiziert oben Build-Ziel zu:

%Vor%

was zum selben Fehler führt. Ich verstehe nicht warum.

Nur um es zu testen, habe ich versucht, von der Kommandozeile zu laufen, indem ich die Hauptklasse direkt anwähle: java -cp . controller.Controller , die aus irgendeinem Grund die Klasse nicht einmal finden kann (sie ist dort, ich habe es bestätigt):

%Vor%

Ich habe JAVA_HOME auf den JDK-Pfad und CLASSPATH auf den JRE-Pfad / lib gesetzt. Betriebssystem ist Windows 7 64 Bit, Java Version ist 1.6.0_25-b06

Ich bin von zwei Dingen verwirrt: a) Warum kann Java controller.Controller nicht finden, obwohl es in der .jar-Datei vorhanden ist und sich die .jar-Datei im aktuellen Verzeichnis befindet? b) Was mache ich falsch, dass das Aufrufen von Java mit -jar die Suchmechanismen zu durcheinander bringt.

Jede Hilfe wird sehr geschätzt.

    
Tobias 28.05.2011, 20:35
quelle

3 Antworten

2

Der Klassenpfad sollte aus

bestehen
  1. Verzeichnisse mit Klassendateien (in ihrem richtigen Paketverzeichnis)
  2. JAR-Dateien.

Sie können den Klassenpfad nicht auf ein Verzeichnis von Gläsern verweisen. Anders verhält es sich beim Ausführen eines Anwendungsservers (zB Tomcat), der jars aus einem Verzeichnis für Sie lädt.

    
leblonk 29.05.2011 18:20
quelle
1
  

obwohl ich ziemlich sicher bin, dass ich es richtig eingestellt habe

Der Beweis ist gegen dich. Die JVM teilt Ihnen mit, dass Sie sie nicht korrekt eingestellt haben.

Was denkst du, worauf ref 'Klassenpfad' zeigt? Woher nehmen Sie an, dass seine Werte herkommen? Sie sollten innerhalb der Ant build.xml definiert werden, richtig? So:

%Vor%

Wenn Sie eine ausführbare JAR erstellen, müssen Sie die Hauptklasse und den Klassenpfad im Manifest angeben, wie CoolBeans im Kommentar korrekt darauf hingewiesen hat. Die JAR-Standorte von Drittanbietern müssen relativ zur ausführbaren JAR sein. Sie sollten sie mit Ihrer ausführbaren JAR-Datei so verpacken, dass der relative Pfad leicht zu sortieren und zu verstehen ist.

    
duffymo 28.05.2011 21:05
quelle
0

Ich habe festgestellt, dass dies passiert, wenn ich beide die <classpath> und die jar="..." im Ziel angeben. Ich entfernte die jar="..." , platzierte diese .jar in die <classpath> Liste und sie lief danach.

    
mormegil 22.11.2014 03:15
quelle