Konnte Java der Hauptklasse nicht finden oder laden? Hier erfahren Sie, wie Sie das Problem beheben können!
Machen Sie sich keine Sorgen, wenn Sie in Ihrem Java-Projekt ohne ersichtlichen Grund immer wieder den Fehler "Klasse nicht gefunden" der Hauptklasse erhalten. Sie sind nicht allein.
Als einer der unvorhersehbarsten und spontansten Fehler, dank der Tendenz von JVM (Java Virtual Machine), sich an einen Standardklassenpfad zu halten, ist das Problem "Hauptklasse nicht gefunden" etwas, das Amateure und Profis gleichermaßen verfolgt.
Aber dieses Problem ist tatsächlich weniger einschüchternd als es scheint. Lesen Sie weiter, um herauszufinden, wie Sie diesen Fehler ein für alle Mal beseitigen können.
Warum wurde die Hauptklasse nicht gefunden?
Bevor wir versuchen zu verstehen, wie und warum JVM die Hauptklasse nicht finden konnte, müssen wir das Konzept von Classpath in Java verstehen.
Was ist Klassenpfad?
Der Klassenpfad ist der Dateipfad, den die Java-Laufzeitumgebung nach Klassen und anderen Ressourcendateien durchsucht. Sie kann entweder mit der Option -classpath beim Ausführen eines Programms oder durch Festlegen der Umgebungsvariablen CLASSPATH des Systems festgelegt werden.
Wie der Name schon sagt, handelt es sich lediglich um einen Dateipfad, in dem sich die .class- Dateien in einem JDK-Paket oder -Verzeichnis befinden.
Wenn die JVM die Hauptklasse nicht finden kann, liegt dies häufig daran, dass sie nach den entsprechenden .class- Dateien im falschen Klassenpfad sucht. Um dieses Problem zu beheben, müssen Sie den Klassenpfad natürlich manuell angeben, indem Sie entweder Pakete verwenden oder den Klassenpfad angeben.
Wenn Sie an dieser Stelle Ihren Speicher für Java-Klassen aktualisieren möchten, lesen Sie unseren Leitfaden zum Erstellen von Klassen in Java .
Pakete verwenden
Erstellen wir eine Klasse namens Test . Legen Sie es in ein Paket namens testPackage . Pakete werden in Java verwendet, um ähnliche Klassen zu gruppieren oder einen eindeutigen Namespace für Klassen bereitzustellen.
In diesem einfachen Beispiel können Sie anhand eines Pakets veranschaulichen, wie der Klassenpfad von Java funktioniert. In Ihrer Dateimanageranwendung wird ein Paket als unabhängiger Ordner dargestellt.
package testPackage;
public class Test {
public static void main(String args[]) {
System.out.println("File successfully found!");
}
}
Öffnen Sie nun ein neues Terminal und stellen Sie sicher, dass Ihr Arbeitsverzeichnis mit dem übereinstimmt, das den Paketordner enthält. Sie können das Arbeitsverzeichnis mit dem Befehl cd auf jedem Betriebssystem ändern.
Kompilieren Sie Test.java, indem Sie den folgenden Befehl ausführen :
package testPackage;
javac testPackage/Test.java
Dadurch wird die kompilierte Binärdatei (die .class-Datei) in testPackage gespeichert.
Um die kompilierte Klasse auszuführen, müssen Sie den vollständig qualifizierten Klassennamen in die Befehlszeile eingeben. Der vollständig qualifizierte Name einer Java-Klasse bezieht sich auf ihren Namen, dem der Paketname vorangestellt ist. In diesem Fall sollte dies ungefähr so aussehen:
java testPackage.Test
Diese Art des Aufrufs von Klassendateien stellt auch sicher, dass Sie ausführbare Dateien aus verschiedenen Paketen aus demselben Arbeitsverzeichnis aufrufen können. Sie müssen lediglich den vollständig qualifizierten Klassennamen ändern.
In fortgeschritteneren Implementierungen empfehlen wir, separate Unterordner für Ihre Klassen und Quelldateien zu erstellen, um die Dateien innerhalb des Pakets besser verwalten zu können.
Manuelles Festlegen des Klassenpfads
Die empfohlene Methode zum Verwalten Ihrer Java-Dateien besteht darin, separate Verzeichnisse für Quelldateien und Klassen zu erstellen. Wenn Sie an einem Projekt arbeiten, ist es wahrscheinlich, dass Sie dies bereits tun.
Herkömmlicherweise wird das Verzeichnis mit Quelldateien als src und das Verzeichnis mit .class-Dateien als Klassen bezeichnet. Auf diese Weise kann auch sichergestellt werden, dass die Wahrscheinlichkeit, dass JVM die Hauptklasse nicht findet, aufgrund des ordnungsgemäß strukturierten Verzeichnisses erheblich verringert wird.
Wenn wir diese Methode verwenden, sieht die Verzeichnisstruktur vor dem Kompilieren folgendermaßen aus:
|---myFolder
| |---src
| |---testPackage
| |---Test.java
|
| |---classes
Jeder Einzug in der obigen Abbildung entspricht einer Ebene der Dateihierarchie, der Ihr Projekt folgen soll.
Stellen Sie zum Kompilieren sicher, dass Ihr Arbeitsverzeichnis myFolder ist. Geben Sie nun den folgenden Befehl ein:
javac -d classes src/testPackage/Test.java
Die ausführbare Datei .class sollte in myFolder / classes / testPackage gespeichert werden . Dementsprechend sieht die Dateiverzeichnisstruktur ungefähr so aus:
|---myFolder
| |---src
| |---testPackage
| |---Test.java
|
| |---classes
| |---testPackage
| |---Test.class
Führen Sie zum Ausführen der .class- Datei den Java-Befehl mit dem vollständig qualifizierten Klassennamen aus und geben Sie den lokalen Klassenpfad an. Jeder Pfad wird relativ zum Arbeitsverzeichnis deklariert, in diesem Fall myFolder.
java -classpath classes testPackage
Wenn Sie diesen Befehl ausführen, erhalten Sie die gewünschte Ausgabe. Aber warum ist so viel Reorganisation notwendig, um einen einfachen Fehler zu beheben?
Die Bedeutung des Organisierens von Dateien in Java
Der Grund, warum die Hauptklasse "Konnte die Hauptklasse nicht finden oder laden" ausgelöst wird, liegt darin, dass JVM nicht finden konnte, wo Ihre .class- Dateien gespeichert wurden.
Der einfachste Weg, um diesen Fehler zu beheben, besteht darin, zu steuern, wo die .class-Dateien gespeichert sind, und JVM explizit anzuweisen, dort nachzuschauen. Dies wird ermöglicht, indem Sie Ihre Quelldateien und ausführbaren Dateien separat organisieren und alles von einem Arbeitsverzeichnis aus steuern.
Wenn Sie Ihrem Projekt Konstrukte wie Vererbung hinzufügen, wird die Komplexität des Dateisystems zwangsläufig um ein Vielfaches zunehmen. In solchen Projekten oder sogar in solchen, in denen die Verwendung von JAR-Dateien oder benutzerdefinierten Bibliotheken erforderlich ist, können Sie durch die einfache Vorgehensweise beim Trennen und Verwalten von Dateien unzählige Stunden an Fehlerbehebung und Fehlerbehebung sparen.
Weitere Informationen zur Funktionsweise von classpath in Java und zu den zahlreichen Funktionen, die Sie beim Ausführen Ihres Codes steuern können, finden Sie in der detaillierten und benutzerfreundlichen Referenz von Oracle.