Wie löse ich ClassNotFoundException?

Lesezeit: 7 Minuten

Wie lose ich
Benutzer2426316

Ich versuche, eine Java-Anwendung auszuführen, bekomme aber diesen Fehler:

java.lang.ClassNotFoundException:

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

  • Sie müssen das Glas mit der fehlenden Klasse zu classptah hinzufügen

    – Crom

    1. Juli 2013 um 16:00 Uhr

  • 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 zum Ordner, der die Klasse enthält, und sagen Sie java -cp . KLASSENNAME

    – Optional

    1. Juli 2013 um 16:05 Uhr


  • Entweder wurde eine Klasse nicht für Ihre Laufzeit bereitgestellt (z. B. fehlendes JAR) oder die Klasse ist in einem bestimmten Klassenladeprogramm nicht sichtbar. Überprüfen Sie dieses Tool, das bei der Fehlerbehebung dieser Probleme hilft: jhades.org

    – Winkeluniversität

    6. Dezember 2013 um 12:05 Uhr

  • Darauf stoße ich auch manchmal. Diese Ausnahme verstößt eindeutig gegen die Regel, den gesamten erforderlichen Kontext in einer Ausnahmenachricht anzugeben. Es sollte erwähnt werden wo es wird versucht nach dem ding zu suchen, was auf deinem classpath steht. Bitte machen Sie bessere Ausnahmemeldungen. Lassen Sie uns nicht nach Informationen suchen, die zur Lösung des Problems beitragen könnten.

    – masterxilo

    25. November 2018 um 14:12 Uhr

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

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 habe C:/myproject/classes in meinem Klassenpfad, und ich versuche, eine Klasse zu laden com.mycompany.Foowird im Klassenverzeichnis nach einem Verzeichnis mit dem Namen gesucht comdann darunter ein Verzeichnis genannt meine Firmaund schließlich wird nach einer Datei namens gesucht Klasse in diesem Verzeichnis.

Im zweiten Fall wird bei JAR-Dateien die JAR-Datei 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, 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 versucht, im Verzeichnis nachzusehen Klassen erst, dann rein stuff.jar und endlich rein Sonstiges.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 sagen java-cp und dann Ihren Klassenpfad. In einer IDE wie Eclipse haben Sie eine Menüoption, um Ihren Klassenpfad anzugeben.

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

Je nachdem, wie Sie Ihre Anwendung starten, müssen Sie die Argumentation überarbeiten -cpIhren Class-Path-Eintrag in MANIFEST.MF oder Ihr Festplattenlayout.

  • Können Sie bitte genauer auf Eclipse eingehen? Was muss ich tun?

    – Benutzer2426316

    1. Juli 2013 um 16:03 Uhr

  • Ihre Frage enthält nicht genügend Informationen, um eine genauere Antwort zu geben. Erwägen Sie, das hinzuzufügen.

    – Thorbjørn Ravn Andersen

    1. Juli 2013 um 16:06 Uhr

  • Abhängigkeitsauflösung/Versionskonflikte sind ein sehr häufiges Problem in praktisch allen Programmierumgebungen. Wir könnten sagen, dass alles, was ein Programm jemals tut, solche Definitionen auflöst … die Frage ist immer, was/wo ist die Definition und welche Version meinst du?

    – masterxilo

    23. November 2018 um 22:44 Uhr

  • Ich betone nur, dass neben der Java-Welt jede Software damit zu kämpfen hat, 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 an Fremdcode wird, desto größer wird das Problem.

    – masterxilo

    25. November 2018 um 14:08 Uhr

  • @masterxilo Ja, aber das ist hier nicht unbedingt das Problem und möglicherweise bellen Sie den falschen Baum an. Man kann nur sagen, dass der Classpath kaputt ist.

    – Thorbjørn Ravn Andersen

    25. November 2018 um 22:20 Uhr

Wie lose ich
Ram Patra

Dies ist das beste Lösung Ich habe bisher gefunden.

Angenommen, wir haben ein Paket mit dem Namen org.mypackage enthält die Klassen:

  • HelloWorld (Hauptklasse)
  • Support-Klasse
  • UtilClass

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

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. Allerdings müssen wir Java auch mitteilen, wo es nach den Dateien und Verzeichnissen suchen soll, die unser Paket definieren. Um das Programm zu starten, müssen wir also den folgenden Befehl verwenden:
Geben Sie hier die Bildbeschreibung ein

HINWEIS: Sie müssen das obige ausführen java Befehl, egal wo Sie sich gerade befinden. Aber das ist nicht der Fall für javac. Zum Kompilieren können Sie sogar direkt in das Verzeichnis gehen, in dem Sie Ihre haben .java Dateien und direkt ausführen javac ClassName.java.

1646709433 341 Wie lose ich
Junid Ahsan

Wenn Sie den Pfad der Klasse oder des JARs kennen, das die Klasse enthält, fügen Sie es Ihrem Klassenpfad hinzu, während Sie es ausführen. 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

1646709433 297 Wie lose ich
Arun

Probieren Sie diese aus, wenn Sie Maven verwenden. Ich benutze Maven für mein Projekt und wenn ich es tue mvn clean install und versuchen, ein Programm auszuführen, das die Ausnahme auslöst. Also bereinige ich das Projekt und führe es erneut aus und es funktioniert für mich.

Ich verwende die Eclipse-IDE.

Versuchen Sie für die Ausnahme „Klasse nicht gefunden“, wenn Sie den Junit-Test ausführen mvn clean test Einmal. Es wird alle Testklassen kompilieren.

  • In welchem ​​Verzeichnis waren Sie, als Sie “mvn clean test” ausgeführt haben? befindet es sich im selben Verzeichnis wie das POM?

    – TacoB0t

    27. März 2018 um 16:19 Uhr

  • Jawohl. Läuft es aus dem Verzeichnis, in dem die pom-Datei vorhanden ist.

    – Arun

    27. März 2018 um 18:26 Uhr

1646709434 298 Wie lose ich
Wassil

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 Konsolenanwendung wie „Hello World“ mit einem einfachen Texteditor und einer Befehlsshell ausprobieren.

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 erzeugt den gleichen Fehler. Stellen Sie außerdem sicher, dass sich der bin-Ordner von Java (JDK/JRE) im PATH der Umgebungsvariablen des Betriebssystems befindet.

  • In welchem ​​Verzeichnis waren Sie, als Sie “mvn clean test” ausgeführt haben? befindet es sich im selben Verzeichnis wie das POM?

    – TacoB0t

    27. März 2018 um 16:19 Uhr

  • Jawohl. Läuft es aus dem Verzeichnis, in dem die pom-Datei vorhanden ist.

    – Arun

    27. März 2018 um 18:26 Uhr

Wenn Sie Maven verwenden, überprüfen Sie, ob Sie dieses Plugin in Ihrem haben 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>

Es wird Ihre Abhängigkeit (den Ausnahmegrund) in Ihr Glas legen.

FYI: Dies schließt alle Abhängigkeiten ein, die im endgültigen Glas aufgeblasen werden

971580cookie-checkWie löse ich ClassNotFoundException?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy