Wie löse ich ClassNotFoundException auf?


106

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

java.lang.ClassNotFoundException:

Nach dem Doppelpunkt steht der Speicherort 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?


1
Sie müssen das Glas mit der fehlenden Klasse zur Klasse hinzufügen
Crom

Wenn Ihre Klasse ein Paket hat, gehen Sie zu dem Ordner, der die Klasse enthält. Wenn das Paket beispielsweise das Paket test.abc ist, gehen Sie vor dem Test in den Ordner und führen Sie dann java -cp aus. test.abc.CLASSNAME (ohne .class). Wenn es kein Paket gibt, gehen Sie zu einem Ordner mit der Klasse und sagen Sie java -cp. KLASSENNAME
Optional

Entweder wurde eine Klasse nicht zu Ihrer Laufzeit bereitgestellt (z. B. fehlende JAR-Datei), oder die Klasse ist in einem bestimmten Klassenladeprogramm nicht sichtbar. Überprüfen Sie dieses Tool, um diese Probleme zu beheben: jhades.org
Angular University

1
Manchmal stoße ich auch darauf. Diese Ausnahme verstößt eindeutig gegen die Regel, den gesamten erforderlichen Kontext in einer Ausnahmemeldung anzugeben. Es sollte erwähnt werden, wo es versucht hat, nach dem Ding zu suchen, was sich auf Ihrem Klassenpfad befindet. Bitte machen Sie bessere Ausnahmemeldungen. Lassen Sie uns nicht nach Informationen suchen, die zur Lösung des Problems beitragen könnten.
Masterxilo

Antworten:


32

Ihr Klassenpfad ist unterbrochen (was in der Java-Welt ein sehr häufiges Problem ist).

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


33
Können Sie bitte spezifischer Eclipse-spezifisch sein? Was muss ich tun?
user2426316

24
Ihre Frage enthält nicht genügend Informationen, um eine genauere Antwort zu geben. Erwägen Sie, das hinzuzufügen.
Thorbjørn Ravn Andersen

Abhängigkeitsauflösung / Versionsinkongruenzen sind in sehr allen Programmierumgebungen ein sehr häufiges Problem. Wir könnten sagen, dass jedes Programm jemals solche Definitionen auflöst ... die Frage ist immer, was / wo die Definition ist und welche Version meinten Sie?
Masterxilo

2
Ich betone nur, dass neben der Java-Welt die gesamte Software darum kämpft, sicherzustellen, dass korrekte Versionen von Abhängigkeiten gefunden werden. Als Beispiele für dieses Problem und mögliche Lösungen kann ich dll-hell, Paketmanager, Versionsmanager, Spring Boot-Stücklisten und Docker-Container nennen. Je größer der Anteil des Fremdcodes wird, desto größer wird das Problem.
Masterxilo

@masterxilo Ja, aber das ist hier nicht unbedingt das Problem und Sie bellen möglicherweise den falschen Baum an. Man kann nur sagen, dass der Klassenpfad unterbrochen ist.
Thorbjørn Ravn Andersen

45

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 namens com gesucht , dann unter diesem Verzeichnis nach mycompany und Schließlich wird in diesem Verzeichnis nach einer Datei namens Foo.class gesucht .

In der zweiten Instanz wird für JAR-Dateien die JAR-Datei nach dieser Klasse durchsucht. Eine JAR-Datei ist in Wirklichkeit nur eine komprimierte Sammlung von Verzeichnissen wie die oben genannten. Wenn Sie eine JAR-Datei entpacken, erhalten Sie eine Reihe von Verzeichnissen und Klassendateien, die dem obigen Muster folgen.

Die JVM durchläuft also einen Klassenpfad von Anfang bis Ende und sucht nach der Definition der Klasse, wenn sie versucht, die Klassendefinition zu laden. Zum Beispiel im Klassenpfad:

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

Die JVM wird versuchen , in dem Verzeichnis suchen Klassen zuerst, dann in stuff.jar und schließlich in otherstuff.jar .

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

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


13

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

Angenommen, wir haben ein Paket org.mypackagemit den Klassen:

  • 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: Geben Sie hier die Bildbeschreibung ein

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 gesucht werden soll, die unser Paket definieren. Um das Programm zu starten, müssen wir den folgenden Befehl verwenden: Geben Sie hier die Bildbeschreibung ein

HINWEIS: Sie müssen den obigen javaBefehl ausführen, unabhängig von Ihrem aktuellen Standort. Dies ist jedoch nicht der Fall javac. Zum Kompilieren können Sie sogar direkt in das Verzeichnis gehen, in dem Sie Ihre .javaDateien haben, und direkt ausführen javac ClassName.java.


6

Wenn Sie den Pfad der Klasse oder das JAR kennen, das die Klasse enthält, fügen Sie ihn Ihrem Klassenpfad hinzu, während Sie ihn ausführen. Sie können den hier erwähnten Klassenpfad verwenden:

unter Windows

java -classpath .;yourjar.jar YourMainClass

unter UNIX / Linux

java -classpath .:yourjar.jar YourMainClass

4

Versuchen Sie diese, wenn Sie Maven verwenden. Ich benutze maven für mein Projekt und wenn ich mvn clean installversuche, ein Programm auszuführen, wird die Ausnahme ausgelöst . Also bereinige ich das Projekt und führe es erneut aus und es funktioniert für mich.

Ich benutze Eclipse IDE.

Versuchen Sie für die Ausnahme "Klasse nicht gefunden" beim Ausführen des Junit-Tests mvn clean testeinmal auszuführen . Es werden alle Testklassen kompiliert.


In welchem ​​Verzeichnis befanden Sie sich, als Sie "mvn clean test" ausführten? befindet es sich im selben Verzeichnis wie das POM?
TacoB0t

1
Ja. Lief es aus dem Verzeichnis, in dem die POM-Datei vorhanden ist.
Arun

3

Um den Speicherort einer Klasse über die Befehlszeile zu Ihrem Klassenpfad hinzuzufügen, fügen Sie einfach -cpoder -classpathund den Speicherort der Klasse hinzu, während Sie sie ausführen. IE

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

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


3

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


5
Das ist unter Windows (Semikolon), unter Unix / Linux ist es ':' (Doppelpunkt)
Joeblade

3

Fügen Sie dem CLASSPATH den vollständigen Pfad der JAR-Datei hinzu. Unter Linux verwenden : export CLASSPATH=".:/full/path/to/file.jar:$CLASSPATH". Eine andere Möglichkeit (ohne den CLASSPATH zu bearbeiten) bestand darin, das JAR im aktuellen Projektordner zu entpacken.

Wege haben bei mir nicht funktioniert:

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

2) Verwenden Sie -cpnur den Namen jar, wenn Sie sich im aktuellen Ordner befinden

3) Kopieren Sie die JAR in den aktuellen Projektordner

4) Kopieren des Glases an die Standardposition von Java-Gläsern (/ usr / share / java)

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


Nur das Entpacken der JAR funktionierte für mich, keine der anderen Lösungen funktionierte
OverCoder

2

Gehen Sie nach oben und entfernen Sie die Importanweisung, falls vorhanden, und importieren Sie die Klasse erneut. Aber wenn das nicht der Fall ist, machen Sie eine Reinigung, dann bauen Sie. Verwenden Sie Netbeans oder Eclipse?


2

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


2
  1. Es kann passieren, dass Ihr Klassenpfad nicht korrekt ist

  2. Lassen Sie uns eine serialisierbare Klasse und eine deserialisierbare Klasse unter demselben Projektnamen setzen. Sie führen die serialisierbare Klasse aus und erstellen ein serialisierbares Objekt in einem bestimmten Ordner. Jetzt benötigen Sie die desearialisierten Daten. In der Zwischenzeit funktioniert es nicht, wenn Sie den Namen des Projekts ändern. 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 Snapshots zu erzwingen. Es wird auch sauber und alle Klassenpfade wieder aufgebaut. Es hat mein Problem gelöst.


2

Ich habe es gerade getan

1. Ungültige Caches und Neustart

2. Mein Projekt wurde neu erstellt, wodurch das Problem behoben wurde


1

Ich habe versucht, .jar aus C # -Code mit Processclass auszuführen . Der Java-Code wurde erfolgreich von Eclipse ausgeführt, jedoch nicht von C # Visual Studio. Selbst wenn Sie direkt auf die JAR-Datei klicken, wurde er mit ClassNotFoundException:Ausnahme immer gestoppt . Die Lösung für mich war, das Java-Programm als "Runnable JAR file" anstelle von "JAR File" zu exportieren. Hoffe es kann jemandem helfen.


1

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


1

Wenn Sie mehr hinzugefügt ( von Drittanbietern) ** Bibliotheken und erweitern ** Anwendungsklasse

Dann könnte es vorkommen.

Dazu müssen Sie multiDexEnabled trueIhre erweiterte ApplicationKlasse festlegen und durch ersetzen MultiDexApplication.

Es wird gelöst.


1

Grundlegende generische Frage - einfachste generische Antwort;)

Angesichts der Informationen gehe ich davon aus, dass Sie möglicherweise einen grundlegenden Ansatz zum Codieren, Erstellen / Kompilieren und Ausführen einer einfachen Konsolen-App wie "Hello World" mit einem einfachen Texteditor und einer Befehlsshell versuchen.

Dieser Fehler tritt im folgenden Szenario auf:

..\SomePath>javac HelloWorld.java
..\SomePath>java HelloWorld.class

Mit anderen Worten, verwenden Sie:

..\SomePath>java HelloWorld

PS Das Hinzufügen der Dateierweiterung .class führt zu demselben Fehler. Stellen Sie außerdem sicher, dass sich der bin-Ordner von Java (JDK / JRE) im PATH des Umgebungsvariablen des Betriebssystems befindet.


1

Wenn Sie maven verwenden, überprüfen Sie, ob Sie dieses Plugin in Ihrem pom.xml:

    <build>
        <plugins>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.0</version>
                <executions>
                    <!-- Attach the shade goal into the package phase -->
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

        </plugins>
    </build>

Dadurch wird Ihre Abhängigkeit (der Ausnahmegrund) in Ihr Glas verschoben.

Zu Ihrer Information : Dies schließt alle Abhängigkeiten ein, die im letzten Glas aufgeblasen sind


@Archit hinzugefügt.
Techkuz

0

In meinem Fall hat die als Ausnahme "Klasse nicht gefunden" ausgelöste Klasse Eigenschaften, die sich auf SSL-Zertifikate beziehen. Schließen Sie die Eclipse und öffnen Sie sie als "Als Administrator ausführen". Das Problem wurde behoben. Da Eclipse eine berechtigungsbezogene Berechtigung hat, wird eine solche Ausnahme ausgelöst.


-7

Fügen Sie den gesamten Code in den try-Block ein und fangen Sie die Ausnahme in einem catch-Block ab

try
{
    // code
}
catch(ClassNotFoundException e1)
{
    e1.getmessage();
}

5
Dadurch wird die Ausnahme nicht behoben. Dies verbirgt die Ausnahme. Darüber hinaus ist "e1.getmessage ()" a) die falsche Großschreibung von getMessage () und b) wird nicht viel bewirken, da eine Zeichenfolge mit einer Nachricht zurückgegeben wird und Sie sie nicht drucken oder protokollieren oder so!
IBBoard
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.