it-swarm.com.de

Wie löse ich ClassNotFoundException auf?

Ich versuche eine Java-Anwendung auszuführen, erhalte jedoch diesen Fehler: 

Java.lang.ClassNotFoundException: 

Nach dem Doppelpunkt folgt die Position der fehlenden Klasse. Ich weiß jedoch, dass dieser Ort nicht existiert, da sich die Klasse an einem anderen Ort befindet. Wie kann ich den Pfad dieser Klasse aktualisieren? Hat es etwas mit dem Klassenpfad zu tun?

78
user2426316

Ihr Klassenpfad ist kaputt (was ein sehr allgemeines Problem in der Java Welt ist).

Abhängig davon, wie Sie Ihre Anwendung starten, müssen Sie das Argument in -cp, Ihren Klassenpfadeintrag in MANIFEST.MF oder Ihr Festplattenlayout ändern.

Ein Klassenpfad ist eine Liste von Speicherorten, von denen Klassen geladen werden sollen. 

Diese "Speicherorte" können entweder Verzeichnisse oder JAR-Dateien sein. 

Bei Verzeichnissen folgt die JVM einem erwarteten Muster zum Laden einer Klasse. Wenn ich das Verzeichnis C:/myproject/classes in meinem Klassenpfad habe und versuche, eine Klasse com.mycompany.Foo zu laden, wird im Klassenverzeichnis nach einem Verzeichnis mit dem Namen com gesucht , dann unter diesem Verzeichnis ein Verzeichnis namens mycompany , und schließlich wird in diesem Verzeichnis nach einer Datei mit dem Namen Foo.class gesucht.

Im zweiten Fall wird die JAR-Datei nach JAR-Dateien nach dieser Klasse durchsucht. Eine JAR-Datei ist in Wirklichkeit nur eine gezippte Sammlung von Verzeichnissen wie oben. Wenn Sie eine JAR-Datei entpacken, erhalten Sie eine Reihe von Verzeichnissen und Klassendateien nach dem oben angegebenen Muster. 

Daher durchläuft die JVM einen Klassenpfad von Anfang bis Ende, um nach der Definition der Klasse zu suchen, wenn versucht wird, die Klassendefinition zu laden. Zum Beispiel im Klassenpfad:

C:/myproject/classes; C: /myproject/lib/stuff.jar; C: /myproject/lib/otherstuff.jar

Die JVM versucht zuerst in das Verzeichnis classes , dann in stuff.jar und schließlich in otherstuff.jar zu suchen.

Wenn Sie eine ClassNotFoundException abrufen, bedeutet dies, dass die JVM den gesamten Klassenpfad durchlaufen hat und nicht die Klasse gefunden hat, die Sie referenzieren wollten. Die Lösung, wie so oft in der Java-Welt, besteht darin, Ihren Klassenpfad zu überprüfen.

Sie definieren einen Klassenpfad in der Befehlszeile, indem Sie Java -cp und dann Ihren Klassenpfad angeben. In einem IDE wie Eclipse haben Sie eine Menüoption, um Ihren Klassenpfad anzugeben.

37
user2000590

Dies ist die beste Lösung , die ich bisher gefunden habe.

Angenommen, wir haben ein Paket namens org.mypackage, das die Klassen enthält:

  • HelloWorld (Hauptklasse) 
  • SupportClass 
  • UtilClass

und die Dateien, die dieses Paket definieren, werden physisch im Verzeichnis D:\myprogram (unter Windows) oder /home/user/myprogram (unter Linux) gespeichert.

Die Dateistruktur sieht folgendermaßen aus: enter image description here

Wenn wir Java aufrufen, geben wir den Namen der auszuführenden Anwendung an: org.mypackage.HelloWorld. Wir müssen Java jedoch auch mitteilen, wo nach den Dateien und Verzeichnissen zu suchen ist, die unser Paket definieren. Um das Programm zu starten, müssen wir den folgenden Befehl verwenden: enter image description here

HINWEIS: Sie müssen den obigen Befehl Java ausführen, unabhängig von Ihrem aktuellen Standort. Dies gilt jedoch nicht für javac. Zum Beim Kompilieren können Sie sogar direkt in das Verzeichnis wechseln, in dem Sie Ihre .Java-Dateien und führen Sie javac ClassName.Java direkt aus.

10
Ram Patra

Wenn Sie den Pfad der Klasse oder der JAR-Datei kennen, die die Klasse enthält, fügen Sie sie während der Ausführung zu Ihrem Klassenpfad hinzu. Sie können den Klassenpfad wie hier erwähnt verwenden:

unter Windows

Java -classpath .;yourjar.jar YourMainClass

unter UNIX/Linux

Java -classpath .:yourjar.jar YourMainClass
6
Juned Ahsan

Probieren Sie diese aus, wenn Sie Maven verwenden. Ich benutze Maven für mein Projekt und wenn ich mvn clean install mache und versuche, ein Programm auszuführen, löst es die Ausnahme aus. Also säubere ich das Projekt und führe es erneut aus, und es funktioniert für mich. 

Ich benutze Eclipse IDE.

Führen Sie für die Klasse Nicht gefundene Ausnahme beim Ausführen des Junit-Tests einmal mvn clean test aus. Es werden alle Testklassen zusammengestellt.

4
Arun

Fügen Sie der CLASSPATH ..__ die Datei full path of jar hinzu. In Linux verwenden Sie: export CLASSPATH=".:/full/path/to/file.jar:$CLASSPATH". Auf andere Weise (ohne Bearbeiten des CLASSPATH) funktionierte das Entpacken des Jars im aktuellen Projektordner.

Wege haben für mich nicht funktioniert:

1) Verwenden der Option -cp mit vollständigem Pfad der JAR-Datei.

2) Verwenden Sie -cpmit nur dem Namen der jar-Datei im aktuellen Ordner

3) Kopieren der Dose in den aktuellen Projektordner

4) Kopieren der Dose in den Standardspeicherort von Java-Dosen (/ usr/share/Java)

Diese Lösung wird für die Klasse com.mysql.jdbc.Driver in mysql-connector-Java.5 - * .jar gemeldet, wenn unter Linux mit OpenJDK Version 1.7 gearbeitet wird.

3

Benutzen ';' als Trennzeichen. Wenn Ihre Umgebungsvariablen richtig eingestellt sind, sollten Sie Ihre Einstellungen sehen. Wenn PATH und CLASSPATH korrekt sind, sollte Windows diese Befehle erkennen. Sie müssen Ihren Computer NICHT neu starten, wenn Sie Java installieren.

3

Um den Ort einer Klasse über die Befehlszeile zu Ihrem Klassenpfad hinzuzufügen, fügen Sie einfach -cp oder -classpath und den Ort der Klasse hinzu, während Sie sie ausführen. I.E.

Java -cp "c:/location/of/file" YourProgram

Wenn Sie eine IDE wie Eclipse ausführen, können Sie mit der rechten Maustaste auf project -> build path -> configure build path Klicken und die externe JAR, die Ihre Klasse enthält, zum Buildpfad hinzufügen.

3
invictvs1

Ich bin auch darauf gestoßen und habe alle anderen Lösungen ausprobiert. Ich hatte die .class-Datei nicht in meinem HTML-Ordner, ich hatte nur die .Java-Datei. Nachdem ich die .class-Datei hinzugefügt hatte, funktionierte das Programm einwandfrei.

2
Jason Robertson
  1. Dies kann passieren, wenn der Klassenpfad nicht korrekt ist 

  2. Lassen Sie uns eine serialisierbare Klasse und eine deserialisierbare Klasse unter demselben Projektnamen positionieren. Sie führen die serialisierbare Klasse aus und erstellen ein serialisierbares Objekt in einem bestimmten Ordner. Jetzt benötigen Sie die desearialisierten Daten. Wenn Sie in der Zwischenzeit den Namen des Projekts ändern, funktioniert es nicht. Sie müssen zuerst die serialisierbare Klasse ausführen und dann die Datei deserialisieren. 

2

Wenn Sie maven Verwenden, versuchen Sie, alle Projekte zu aktualisieren und die Momentaufnahmen zu erzwingen . Außerdem werden alle Klassenpfade ...__ bereinigt und neu erstellt.

2
ibrahimgunes

Gehen Sie nach oben und entfernen Sie die Importanweisung, falls vorhanden, und importieren Sie die Klasse erneut. Wenn dies nicht der Fall ist, führen Sie einen Clean-Build durch. Verwenden Sie Netbeans oder Eclipse?

2
yams

Ich habe es gerade getan 

1.Invalidierung von Caches und Neustart 

2. Mein Projekt neu aufgebaut welches das Problem gelöst hat

2
Jyoti JK

Dies kann unter Windows nach einem Java-Update passieren, bei dem die alte Version des Java SDK fehlt und eine neue Version vorhanden ist. Ich würde prüfen, ob Ihre IDE die installierte Java SDK-Version verwendet (IntelliJ: STRG + UMSCHALT + ALT + S).

1
s5s

Ich habe versucht, .jar mit Process class vom C # -Code auszuführen. Der Java-Code wurde erfolgreich von Eclipse ausgeführt, aber nicht von C # Visual Studio. Wenn Sie sogar direkt auf die JAR-Datei klicken, wurde er immer mit der Ausnahme ClassNotFoundException: beendet. Lösung für mich war das Java-Programm als "Runnable JAR-Datei" anstelle von "JAR-Datei" zu exportieren. Ich hoffe es kann jemandem helfen.

1
Dani Aya

Wenn Sie mehrere (Drittanbieter-) ** Bibliotheken hinzugefügt und ** Anwendung Klasse erweitert haben

Dann könnte es vorkommen.

Dafür müssen Sie multiDexEnabled true setzen und Ihre erweiterte Application-Klasse durch MultiDexApplication ersetzen.

Es wird gelöst.

0
Parth Patel

Grundlegende generische Frage - einfachste generische Antwort;)

In Anbetracht der Informationen gehe ich davon aus, dass Sie einen einfachen Ansatz zum Codieren, Erstellen/Kompilieren und Ausführen einer einfachen Konsolen-App wie "Hello World" versuchen, indem Sie einen einfachen Texteditor und eine Befehls-Shell verwenden.

Dieser Fehler tritt in dem folgenden Szenario auf:

..\SomePath>javac HelloWorld.Java
..\SomePath>Java HelloWorld.class

Mit anderen Worten:

..\SomePath>Java HelloWorld

P.S. Das Hinzufügen der Dateierweiterung .class verursacht den gleichen Fehler . Stellen Sie außerdem sicher, dass sich der Bin-Ordner von Java (JDK/JRE) im PFAD des Betriebssystems für Umgebungsvariablen befindet. PPS War ich in meinen Annahmen richtig?

0
Vasil