Ein häufiges Problem, das bei neuen Java Entwicklern auftritt, besteht darin, dass ihre Programme nicht mit der folgenden Fehlermeldung ausgeführt werden können: Could not find or load main class ...
Was bedeutet das, was verursacht es und wie sollten Sie es beheben?
Java <class-name>
BefehlssyntaxZunächst müssen Sie wissen, wie ein Programm mit dem Befehl Java
(oder javaw
) korrekt gestartet werden kann.
Die normale Syntax1 ist das:
Java [ <option> ... ] <class-name> [<argument> ...]
dabei ist <option>
eine Befehlszeilenoption (beginnend mit einem "-" - Zeichen), <class-name>
ein vollständig qualifizierter Klassenname Java und <argument>
ein beliebiges Befehlszeilenargument das wird an Ihre Anwendung übergeben.
1 - Es gibt eine zweite Syntax für "ausführbare" JAR-Dateien, die ich unten beschreiben werde.
Der vollständig qualifizierte Name (FQN) für die Klasse wird wie im Quellcode Java geschrieben. z.B.
packagename.packagename2.packagename3.ClassName
In einigen Versionen des Befehls Java
können Sie jedoch Schrägstriche anstelle von Punkten verwenden. z.B.
packagename/packagename2/packagename3/ClassName
das (verwirrenderweise) wie ein Dateipfad aussieht, aber keiner ist. Beachten Sie, dass der Begriff vollqualifizierter Name die Standardterminologie Java ist ... nicht etwas, das ich nur erfunden habe, um Sie zu verwirren :-)
Hier ist ein Beispiel, wie ein Java
-Befehl aussehen sollte:
Java -Xmx100m com.acme.example.ListUsers fred joe bert
Das Obige bewirkt, dass der Befehl Java
Folgendes ausführt:
com.acme.example.ListUsers
.main
-Methode mit Signatur , Rückgabetyp und Modifikatoren = hat gegeben durch public static void main(String[])
. (Beachten Sie, dass der Name des Methodenarguments NICHT Teil der Signatur ist.)String[]
übergeben.Wenn Sie die Meldung "Hauptklasse konnte nicht gefunden oder geladen werden ..." erhalten, bedeutet dies, dass der erste Schritt fehlgeschlagen ist. Der Befehl Java
konnte die Klasse nicht finden. Das "..." in der Nachricht ist in der Tat der vollqualifizierte Klassenname , nach dem Java
sucht.
Warum kann es also sein, dass die Klasse nicht gefunden wird?
Die erste mögliche Ursache ist, dass Sie möglicherweise den falschen Klassennamen angegeben haben. (Oder ... der richtige Klassenname, aber in der falschen Form.) In Anbetracht des obigen Beispiels gibt es hier eine Vielzahl von falschen Möglichkeiten , die Klasse anzugeben Name:
Beispiel # 1 - ein einfacher Klassenname:
Java ListUser
Wenn die Klasse in einem Paket wie com.acme.example
deklariert ist, müssen Sie den vollständigen Klassennamen einschließlich im Befehl Java
verwenden. z.B.
Java com.acme.example.ListUser
Beispiel # 2 - ein Dateiname oder Pfadname anstelle eines Klassennamens:
Java ListUser.class
Java com/acme/example/ListUser.class
Beispiel # 3 - Ein Klassenname mit falscher Schreibweise:
Java com.acme.example.listuser
Beispiel # 4 - ein Tippfehler
Java com.acme.example.mistuser
Beispiel # 5 - Ein Quellendateiname
Java ListUser.Java
Beispiel # 6 - Sie haben den Klassennamen komplett vergessen
Java lots of arguments
Die zweite wahrscheinliche Ursache ist, dass der Klassenname korrekt ist, der Befehl Java
die Klasse jedoch nicht finden kann. Um dies zu verstehen, müssen Sie das Konzept des "Klassenpfads" verstehen. Dies wird well in der Oracle-Dokumentation erklärt:
Java
BefehlsdokumentationAlso ... wenn Sie den Klassennamen korrekt angegeben haben, müssen Sie als Nächstes überprüfen, ob Sie den Klassenpfad korrekt angegeben haben:
Java
wirksam ist. Überprüfen Sie, ob die Verzeichnisnamen und JAR-Dateinamen korrekt sind.Java
gültig ist.;
unter Windows und :
unter den anderen. Wenn Sie das falsche Trennzeichen für Ihre Plattform verwenden, wird keine explizite Fehlermeldung angezeigt. Stattdessen wird eine nicht vorhandene Datei angezeigt oder Verzeichnis auf dem Pfad, das unbemerkt ignoriert wird.)Wenn Sie ein Verzeichnis in den Klassenpfad einfügen, entspricht es fiktiv dem Stamm des qualifizierten Namensraums. Klassen befinden sich in der Verzeichnisstruktur unter dem Stammverzeichnis ), indem der vollständig qualifizierte Name einem Pfadnamen zugeordnet wird . Wenn sich beispielsweise "/ usr/local/acme/classes" im Klassenpfad befindet, sucht die JVM nach einer Klasse mit dem Namen com.acme.example.Foon
und sucht nach einer ".class" -Datei mit diesem Pfadnamen:
/usr/local/acme/classes/com/acme/example/Foon.class
Wenn Sie "/ usr/local/acme/classes/com/acme/example" in den Klassenpfad aufgenommen hätten, könnte die JVM die Klasse nicht finden.
Wenn Ihre Klassen-FQN com.acme.example.Foon
ist, sucht die JVM im Verzeichnis "com/acme/example" nach "Foon.class":
Wenn Ihre Verzeichnisstruktur nicht mit der Paketbenennung gemäß dem obigen Muster übereinstimmt, wird Ihre Klasse von der JVM nicht gefunden.
Wenn Sie versuchen, eine Klasse umzubenennen , indem Sie sie verschieben, schlägt dies ebenfalls fehl ... aber die Ausnahmestapelverfolgung ist anders. Es kann ungefähr so lauten:
Caused by: Java.lang.NoClassDefFoundError: <path> (wrong name: <name>)
weil der FQN in der Klassendatei nicht mit dem übereinstimmt, was der Klassenladeprogramm erwartet.
Um ein konkretes Beispiel zu geben:
com.acme.example.Foon
Klasse ausführen,/usr/local/acme/classes/com/acme/example/Foon.class
,/usr/local/acme/classes/com/acme/example/
,dann:
# wrong, FQN is needed
Java Foon
# wrong, there is no `com/acme/example` folder in the current working directory
Java com.acme.example.Foon
# wrong, similar to above
Java -classpath . com.acme.example.Foon
# fine; relative classpath set
Java -classpath ../../.. com.acme.example.Foon
# fine; absolute classpath set
Java -classpath /usr/local/acme/classes com.acme.example.Foon
Anmerkungen:
-classpath
kann in den meisten Java - Versionen auf -cp
gekürzt werden. Überprüfen Sie die entsprechenden manuellen Einträge für Java
, javac
und so weiter.Der Klassenpfad muss alle Klassen other (non-system) enthalten, von denen Ihre Anwendung abhängt. (Die Systemklassen werden automatisch gefunden, und Sie müssen sich selten damit befassen.) Damit die Hauptklasse korrekt geladen werden kann, muss die JVM Folgendes ermitteln:
(Hinweis: Die JLS- und JVM-Spezifikationen ermöglichen es einer JVM, Klassen "träge" zu laden. Dies kann sich auf das Auslösen einer Classloader-Ausnahme auswirken.)
Es kommt gelegentlich vor, dass jemand eine Quellcodedatei in den falschen Ordner seines Quellcodebaums legt oder die package
-Deklaration weglässt. Wenn Sie dies in einer IDE tun, werden Sie vom IDE-Compiler sofort darüber informiert. Wenn Sie ein anständiges Build-Tool Java verwenden, führt das Tool javac
auf eine Weise aus, die das Problem erkennt. Wenn Sie jedoch Ihren Java - Code von Hand erstellen, können Sie dies so tun, dass der Compiler das Problem nicht bemerkt und die resultierende ".class" -Datei nicht an der Stelle liegt, die Sie erwarten sein.
Es gibt viele Dinge zu überprüfen, und es ist leicht, etwas zu verpassen. Versuchen Sie, die Option -Xdiag
in die Befehlszeile Java
einzufügen (als erstes nach Java
). Es gibt verschiedene Dinge über das Laden von Klassen aus, und dies kann Ihnen Hinweise darauf geben, was das eigentliche Problem ist.
Berücksichtigen Sie auch mögliche Probleme beim Kopieren und Einfügen von unsichtbaren oder Nicht-ASCII-Zeichen von Websites, Dokumenten usw. Und denken Sie an "Homoglyphen", wenn zwei Buchstaben oder Symbole gleich aussehen ... aber nicht.
Java -jar <jar file>
-SyntaxDie alternative Syntax für "ausführbare" JAR-Dateien lautet wie folgt:
Java [ <option> ... ] -jar <jar-file-name> [<argument> ...]
z.B.
Java -Xmx100m -jar /usr/local/acme-example/listuser.jar fred
In diesem Fall werden der Name der Einstiegspunktklasse (d. H. com.acme.example.ListUser
) und der Klassenpfad im MANIFEST der JAR-Datei angegeben.
Ein typisches Java IDE unterstützt das Ausführen von Java - Anwendungen in der IDE - JVM selbst oder in einer untergeordneten JVM. Diese sind im Allgemeinen immun gegen diese spezielle Ausnahme, da die IDE ihre eigenen Mechanismen verwendet, um den Laufzeitklassenpfad zu erstellen, die Hauptklasse zu identifizieren und die Java
zu erstellen. Befehlszeile.
Es ist jedoch weiterhin möglich, dass diese Ausnahme auftritt, wenn Sie Aufgaben hinter der IDE ausführen. Wenn Sie beispielsweise zuvor in Eclipse einen Application Launcher für Ihre Java - App eingerichtet haben und anschließend die JAR-Datei mit der Klasse "main" an eine andere Stelle im Dateisystem verschoben haben ) Ohne Eclipse mitzuteilen, würde Eclipse die JVM unwissentlich mit einem falschen Klassenpfad starten.
Kurz gesagt, wenn dieses Problem in einer IDE auftritt, überprüfen Sie, ob der Status IDE veraltet ist, die Projektreferenzen nicht mehr funktionieren oder die Launcher-Konfigurationen nicht mehr funktionieren.
Es ist auch möglich, dass eine IDE einfach verwirrt wird. IDEs sind äußerst komplizierte Software-Teile, die aus vielen interagierenden Teilen bestehen. Viele dieser Teile verwenden verschiedene Caching-Strategien, um das IDE als Ganzes ansprechbar zu machen. Diese können manchmal schief gehen und ein mögliches Symptom sind Probleme beim Starten von Anwendungen. Wenn Sie vermuten, dass dies passiert, lohnt es sich, die IDE neu zu starten.
Wenn Ihr Quellcode HelloWorld.Java heißt, lautet Ihr kompilierter Code HelloWorld.class
.
Sie erhalten diesen Fehler, wenn Sie ihn folgendermaßen aufrufen:
Java HelloWorld.class
Verwenden Sie stattdessen Folgendes:
Java HelloWorld
Wenn sich Ihre Klassen in Paketen befinden Dann müssen Sie cd
in das Stammverzeichnis Ihres Projekts und unter Verwendung des vollständig qualifizierten Namens der Klasse (packageName.MainClassName) ausführen.
Beispiel:
Meine Klassen sind hier:
D:\project\com\cse\
Der vollständig qualifizierte Name meiner Hauptklasse lautet:
com.cse.Main
Also ich cd
zurück in das Root-Projektverzeichnis:
D:\project
Geben Sie dann den Befehl Java
ein:
Java com.cse.Main
Diese Antwort soll neue Java Programmierer vor der Frustration retten, die durch einen häufigen Fehler verursacht wird. Ich empfehle Ihnen, die akzeptierte Antwort zu lesen, um detailliertere Kenntnisse über den Java - Klassenpfad zu erhalten .
Wenn Sie die Hauptklasse und die Hauptmethode in einem package
definieren, sollten Sie sie mit dem vollständigen Namen der Klasse (packageName.MainClassName
) über das hierarchische Verzeichnis ausführen.
Angenommen, es gibt eine Quellcodedatei (Main.Java):
package com.test;
public class Main {
public static void main(String[] args) {
System.out.println("salam 2nya\n");
}
}
Um diesen Code auszuführen, sollten Sie Main.Class
in das Paketverzeichnis ./com/test/Main.Java
einfügen. Und im Stammverzeichnis verwenden Sie Java com.test.Main
.
Wenn derselbe Code auf einem PC funktioniert, der Fehler jedoch auf einem anderen angezeigt wird, ist die beste Lösung, die ich je gefunden habe, das Kompilieren wie folgt:
javac HelloWorld.Java
java -cp . HelloWorld
Was mir geholfen hat, war die Angabe des Klassenpfads in der Befehlszeile, zum Beispiel:
Erstellen Sie einen neuen Ordner, C:\temp
Erstellen Sie die Datei Temp.Java in C:\temp
mit der folgenden Klasse:
public class Temp {
public static void main(String args[]) {
System.out.println(args[0]);
}
}
Öffnen Sie eine Befehlszeile im Ordner C:\temp
und schreiben Sie den folgenden Befehl, um die Temp-Klasse zu kompilieren:
javac Temp.Java
Führen Sie die kompilierte Klasse Java aus und fügen Sie die Option -classpath
hinzu, um JRE mitzuteilen, wo sich die Klasse befindet:
Java -classpath C:\temp Temp Hello!
Laut der Fehlermeldung ("Hauptklasse konnte nicht gefunden oder geladen werden") gibt es zwei Kategorien von Problemen:
Die Hauptklasse konnte nicht gefunden sein, wenn Tippfehler oder falsche Syntax im vollständig qualifizierten Klassennamen oder existiert nicht im angegebenen Klassenpfad.
Die Hauptklasse konnte nicht geladen sein, wenn die Klasse kann nicht initiiert werden, normalerweise erweitert die Hauptklasse eine andere Klasse und diese Klasse existiert nicht im angegebenen Klassenpfad.
Zum Beispiel:
public class YourMain extends org.Apache.camel.spring.Main
Wenn die Kamelfeder nicht enthalten ist, wird dieser Fehler gemeldet.
Ich hatte in diesem Fall einen solchen Fehler:
Java -cp lib.jar com.mypackage.Main
Es funktioniert mit ;
für Windows und :
für Unix:
Java -cp lib.jar; com.mypackage.Main
Manchmal hat das, was das Problem verursachen könnte, nichts mit der Hauptklasse zu tun, und ich musste es auf die harte Tour herausfinden. Es war eine referenzierte Bibliothek, die ich umgezogen habe und die mir Folgendes gab:
Hauptklasse xxx Linux konnte nicht gefunden oder geladen werden
Ich habe diesen Verweis gerade gelöscht, wieder hinzugefügt und es hat wieder gut funktioniert.
Verwenden Sie diesen Befehl:
_Java -cp . [PACKAGE.]CLASSNAME
_
Beispiel: Wenn Ihr Klassenname Hello.class ist, der aus Hello.Java erstellt wurde, verwenden Sie den folgenden Befehl:
_Java -cp . Hello
_
Wenn sich Ihre Datei Hello.Java im Paket com.demo befindet, verwenden Sie den folgenden Befehl
_Java -cp . com.demo.Hello
_
In JDK 8 kommt es häufig vor, dass sich die Klassendatei im selben Ordner befindet, aber der Befehl Java
erwartet den Klassenpfad. Aus diesem Grund fügen wir -cp .
hinzu, um den aktuellen zu ermitteln Ordner als Referenz für Klassenpfad.
Try - Xdiag .
Steve Cs Antwort deckt die möglichen Fälle gut ab, aber manchmal ist es nicht so einfach zu bestimmen, ob die Klasse nicht gefunden oder geladen sein könnte. Verwenden Sie Java -Xdiag
(seit JDK 7). Hiermit wird ein Nice-Stacktrace ausgedruckt, das einen Hinweis darauf gibt, was die Nachricht Could not find or load main class
bedeutet.
Beispielsweise kann es Sie auf andere Klassen verweisen, die von der Hauptklasse verwendet wurden, die nicht gefunden wurden, und das Laden der Hauptklasse verhindern.
In diesem Fall haben Sie:
Hauptklasse konnte nicht gefunden oder geladen werden ? Klassenpfad
Dies liegt daran, dass Sie "-classpath" verwenden, der Bindestrich jedoch nicht mit dem Bindestrich identisch ist, der von Java
in der Eingabeaufforderung verwendet wird. Ich hatte dieses Problem beim Kopieren und Einfügen von Notepad nach cmd.
In meinem Fall trat ein Fehler auf, weil ich anstelle des Klassennamens den Namen der Quelldatei angegeben hatte.
Wir müssen den Klassennamen, der die Hauptmethode enthält, an den Interpreter übergeben.
Ich hatte das gleiche Problem und fand schließlich meinen Fehler :) Ich habe diesen Befehl zum Kompilieren verwendet und es hat richtig funktioniert.
javac -cp "/home/omidmohebbi/AAAATest/jars/core-1.7.jar:/home/omidmohebbi/AAAATest/jars/javase-1.7.jar:/home/omidmohebbi/AAAATest/jars/qrgen-1.2.jar" qrcode.Java
aber dieser Befehl hat bei mir nicht funktioniert (Hauptklasse qrcode konnte nicht gefunden oder geladen werden)
Java -cp "/home/omidmohebbi/AAAATest/jars/core-1.7.jar:/home/omidmohebbi/AAAATest/jars/javase-1.7.jar:/home/omidmohebbi/AAAATest/jars/qrgen-1.2.jar" qrcode
Schließlich habe ich am Ende des Klassenpfads das Zeichen ':' hinzugefügt und das Problem behoben.
Java -cp "/home/omidmohebbi/AAAATest/jars/core-1.7.jar:/home/omidmohebbi/AAAATest/jars/javase-1.7.jar:/home/omidmohebbi/AAAATest/jars/qrgen-1.2.jar:" qrcode
)
Ich habe ziemlich viel Zeit damit verbracht, dieses Problem zu lösen. Ich dachte, dass ich irgendwie meinen Klassenpfad falsch eingestellt habe, aber das Problem war, dass ich Folgendes eingegeben habe:
Java -cp C:/Java/MyClasses C:/Java/MyClasses/utilities/myapp/Cool
anstatt von:
Java -cp C:/Java/MyClasses utilities/myapp/Cool
Ich dachte, die Bedeutung von "vollständig qualifiziert" soll den vollständigen Pfadnamen anstelle des vollständigen Paketnamens enthalten.
Dies könnte Ihnen helfen, wenn Ihr Fall speziell meinem ähnelt: Als Anfänger bin ich auch auf dieses Problem gestoßen, als ich versuchte, ein Programm Java auszuführen.
Ich habe es so zusammengestellt:
javac HelloWorld.Java
Und ich habe versucht, auch mit der gleichen Erweiterung zu laufen:
Java Helloworld.Java
Als ich den .Java
entfernte und den Befehl wie Java HelloWorld
umschrieb, lief das Programm perfekt. :)
Was das Problem in meinem Fall behoben hat, war:
Klicken Sie mit der rechten Maustaste auf das Projekt/die Klasse, das/die Sie ausführen möchten, und klicken Sie dann auf Run As
-> Run Configurations
. Dann sollten Sie entweder Ihre bestehende Konfiguration korrigieren oder auf folgende Weise neue hinzufügen:
öffnen Sie die Registerkarte Classpath
, klicken Sie auf die Schaltfläche Advanced...
und fügen Sie bin
Ordner Ihres Projekts hinzu.
Alle Antworten hier richten sich an Windows-Benutzer. Für Mac ist das Klassenpfadtrennzeichen :
, nicht ;
. Da beim Festlegen des Klassenpfads mit ;
ein Fehler aufgetreten ist, kann dies schwierig sein, wenn Sie von Windows zu Mac wechseln.
Hier ist der entsprechende Mac-Befehl:
Java -classpath ".:./lib/*" com.test.MyClass
Wobei in diesem Beispiel das Paket com.test
ist und ein lib
-Ordner ebenfalls im Klassenpfad enthalten sein soll.
Stellen Sie zuerst den Pfad mit diesem Befehl ein.
set path="paste the set path address"
Dann müssen Sie das Programm laden. Geben Sie "cd (folder name)" in das gespeicherte Laufwerk ein und kompilieren Sie es. Wenn beispielsweise mein Programm auf dem Laufwerk D gespeichert ist, geben Sie "D:" ein, drücken Sie die Eingabetaste und geben Sie "cd (Ordnername)" ein.
Wenn Sie zum Erstellen der JAR-Datei Maven verwenden, müssen Sie die Hauptklasse in der Datei pom.xml angeben:
<build>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>class name us.com.test.abc.MyMainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
Unter Windows setzen Sie .;
am Anfang auf den Wert CLASSPATH.
Das . (Punkt) bedeutet "im aktuellen Verzeichnis suchen". Dies ist eine dauerhafte Lösung.
Sie können es auch mit set CLASSPATH=%CLASSPATH%;.
"einmalig" einstellen. Dies wird so lange dauern, wie Ihr cmd-Fenster geöffnet ist.
Dies ist ein spezieller Fall, aber da ich auf dieser Seite nach einer Lösung gesucht habe und diese nicht gefunden habe, werde ich sie hier hinzufügen.
Windows (getestet mit 7) akzeptiert keine Sonderzeichen (wie á
) in Klassen- und Paketnamen. Linux jedoch schon.
Das habe ich herausgefunden, als ich in NetBeans einen .jar
erstellt und versucht habe, ihn in der Befehlszeile auszuführen. Es lief in NetBeans, aber nicht in der Befehlszeile.
Sie müssen dies wirklich aus dem Ordner src
heraus tun. Dort geben Sie folgende Kommandozeile ein:
[name of the package].[Class Name] [arguments]
Nehmen wir an, Ihre Klasse heißt CommandLine.class
und der Code sieht folgendermaßen aus:
package com.tutorialspoint.Java;
/**
* Created by mda21185 on 15-6-2016.
*/
public class CommandLine {
public static void main(String args[]){
for(int i=0; i<args.length; i++){
System.out.println("args[" + i + "]: " + args[i]);
}
}
}
Dann sollten Sie cd
in den Ordner src und der Befehl, den Sie ausführen müssen, so aussehen:
Java com.tutorialspoint.Java.CommandLine this is a command line 200 -100
Und die Ausgabe in der Befehlszeile wäre:
args[0]: this
args[1]: is
args[2]: a
args[3]: command
args[4]: line
args[5]: 200
args[6]: -100
In einigen Online-Compilern, die Sie möglicherweise ausprobiert haben, wird dieser Fehler manchmal angezeigt, wenn Sie nicht public class [Classname]
, sondern nur class [Classname]
schreiben.
Wenn Sie Java
mit der in Windows PowerShell angekündigten Option -cp
ausführen, wird möglicherweise eine Fehlermeldung angezeigt, die ungefähr so aussieht:
The term `ClassName` is not recognized as the name of a cmdlet, function, script ...
Damit PowerShell den Befehl annehmen kann, müssen die Argumente der Option -cp
in Anführungszeichen wie folgt enthalten sein:
Java -cp 'someDependency.jar;.' ClassName
Wenn Sie den Befehl auf diese Weise bilden, sollte Java die Klassenpfadargumente korrekt verarbeiten können.
Beim Testen einer Java MongoDB-JDBC-Verbindung sind ähnliche Fehler aufgetreten. Ich denke, es ist gut, meine endgültige Lösung kurz zusammenzufassen, damit in Zukunft jeder direkt in die beiden Befehle hineinschauen und weiter vorgehen kann.
Angenommen, Sie befinden sich in dem Verzeichnis, in dem Ihre Java -Datei und externe Abhängigkeiten (JAR-Dateien) vorhanden sind.
Compile:
javac -cp mongo-Java-driver-3.4.1.jar JavaMongoDBConnection.Java
Ausführen:
Java -cp mongo-Java-driver-3.4.1.jar: JavaMongoDBConnection
In Ordnung, viele Antworten bereits, aber niemand erwähnte den Fall, in dem die Erlaubnis zur Einreichung von Dateien der Schuldige sein kann. Beim Ausführen hat der Benutzer keinen Zugriff auf die JAR-Datei oder eines der Verzeichnisse des Pfads. Zum Beispiel betrachten:
Jar-Datei in /dir1/dir2/dir3/myjar.jar
Benutzer1, dem das Glas gehört, darf:
# Running as User1
cd /dir1/dir2/dir3/
chmod +r myjar.jar
Aber es funktioniert immer noch nicht:
# Running as User2
Java -cp "/dir1/dir2/dir3:/dir1/dir2/javalibs" MyProgram
Error: Could not find or load main class MyProgram
Dies liegt daran, dass der aktive Benutzer (Benutzer2) keinen Zugriff auf dir1, dir2 oder javalibs oder dir3 hat. Es kann jemanden verrückt machen, wenn Benutzer1 die Dateien sehen und auf sie zugreifen kann, aber der Fehler tritt immer noch bei Benutzer2 auf
In meinem Fall erhielt ich den Fehler, weil ich UPPER- und Kleinbuchstaben auf einem Windows 7-System gemischt hatte. Durch Ändern der Paketnamen in Kleinbuchstaben wurde das Problem behoben. Beachten Sie auch, dass in diesem Szenario kein Fehler beim Kompilieren der .Java-Datei in eine .class-Datei aufgetreten ist. Es würde einfach nicht von demselben (sub-sub-sub-) Verzeichnis ausgeführt werden.
Wenn Sie in Java die JVM manchmal über die Befehlszeile mit der ausführbaren Datei Java ausführen und versuchen, ein Programm aus einer Klassendatei mit Public Static Void Main (PSVM) zu starten, tritt möglicherweise der folgende Fehler auf Auch wenn der Parameter classpath für die JVM korrekt ist und die Klassendatei im Klassenpfad vorhanden ist:
Error: main class not found or loaded
Dies passiert, wenn die Klassendatei mit PSVM nicht geladen werden konnte. Ein möglicher Grund dafür ist, dass die Klasse möglicherweise eine Schnittstelle implementiert oder eine andere Klasse erweitert, die sich nicht im Klassenpfad befindet. Befindet sich eine Klasse nicht im Klassenpfad, wird dies normalerweise durch einen Fehler angezeigt. Wenn die verwendete Klasse jedoch erweitert oder implementiert ist, kann Java die Klasse selbst nicht laden.
Referenz: https://www.computingnotes.net/Java/error-main-class-not-found-or-loaded/
Ich konnte dieses Problem mit den hier angegebenen Lösungen nicht lösen (obwohl die angegebene Antwort ohne Zweifel meine Konzepte geklärt hat). Ich war zweimal mit diesem Problem konfrontiert und habe jedes Mal andere Lösungen ausprobiert (in der Eclipse-IDE).
main
Methoden gestoßen. Also hatte ich die Methode main
aus nachfolgenden Klassen gelöscht.Ich hatte eine komische.
Fehler: Hauptklasse mypackage.App konnte nicht gefunden oder geladen werden
Es stellte sich heraus, dass ich in der pom.xml meines Projekts eine übergeordnete Konfiguration hatte (die pom.xml meines Projekts zeigte auf eine übergeordnete pom.xml) und der relativePath war aus/falsch.
Unten ist ein Teil der pom.xml meines Projekts
<parent>
<groupId>myGroupId</groupId>
<artifactId>pom-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../badPathHere/pom.xml</relativePath>
</parent>
Sobald ich den pom relativePath behoben hatte, verschwand der Fehler.
Stelle dir das vor.
Ich habe diese Fehlermeldung erhalten, nachdem ich mvn Eclipse:eclipse
ausgeführt habe. Dies hat meine .classpath
-Datei ein wenig durcheinander gebracht.
Musste die Zeilen in .classpath
von ändern
<classpathentry kind="src" path="src/main/Java" including="**/*.Java"/>
<classpathentry kind="src" path="src/main/resources" excluding="**/*.Java"/>
zu
<classpathentry kind="src" path="src/main/Java" output="target/classes" />
<classpathentry kind="src" path="src/main/resources" excluding="**" output="target/classes" />
Manchmal ist es besser, die hinzugefügten JAR-Dateien zu entfernen und sie mit geeigneten Build-Hilfen erneut hinzuzufügen. Für mich war es ein regelmäßiges Problem und ich verfolgte den gleichen Ansatz:
Im Kontext der IDE -Entwicklung (Eclipse, NetBeans oder was auch immer) müssen Sie Ihre Projekteigenschaften so konfigurieren, dass eine Hauptklasse vorhanden ist, damit Ihre IDE weiß, wo sich die Hauptklasse befindet ausgeführt werden, wenn Sie "Play" drücken.
Das ist mir auch passiert. In meinem Fall passierte dies nur, wenn eine HttpServlet
-Klasse im Quellcode vorhanden war (die Idea Intellij hat keinen Fehler bei der Kompilierung verursacht, das Servlet-Paket wurde einwandfrei importiert, aber zur Laufzeit gab es diese main class
error).
Ich habe es geschafft, es zu lösen. Ich ging zu Datei - Projektstruktur:
Dann zu den Modulen:
In der Nähe des Servlet-Moduls befand sich ein Bereitstellungsbereich. Ich habe es in Kompilieren geändert:
Und es hat funktioniert!
Standardmäßig verwendet Java .
, das aktuelle Arbeitsverzeichnis, als Standard CLASSPATH
. Wenn Sie an der Eingabeaufforderung einen Befehl eingeben, z. Java MyClass
, der Befehl wird so interpretiert, als hätten Sie Java -cp . MyClass
eingegeben. Haben Sie diesen Punkt zwischen -cp
und MyClass
gesehen? (cp ist kurz für die längere classpath Option)
Dies ist in den meisten Fällen ausreichend, und es scheint, als ob alles einwandfrei funktioniert, bis Sie irgendwann versuchen, Ihrem CLASSPATH
ein Verzeichnis hinzuzufügen. In den meisten Fällen führen Programmierer dazu einfach einen Befehl wie set CLASSPATH=path\to\some\dir
aus. Dieser Befehl erstellt eine neue Umgebungsvariable mit dem Namen CLASSPATH
mit dem Wert path\to\some\dir
oder ersetzt ihren Wert durch path\to\some\dir
, wenn CLASSPATH
bereits zuvor festgelegt wurde.
In diesem Fall haben Sie jetzt eine CLASSPATH
-Umgebungsvariable und Java verwendet nicht mehr den Standardklassenpfad (.
), sondern den von Ihnen festgelegten. Also schreiben Sie am nächsten Tag, wenn Sie Ihren Editor öffnen, ein Java Programm, cd
in das Verzeichnis, in dem Sie es gespeichert haben, kompilieren es und versuchen es mit dem Befehl Java MyClass
auszuführen. und Sie werden mit einer netten Ausgabe begrüßt: Konnte Hauptklasse nicht finden oder laden ... (Wenn Ihre Befehle funktionierten lange vorher und Sie bekommen jetzt diese Ausgabe, dann könnte dies für Sie der Fall sein).
Wenn Sie den Befehl Java MyClass
ausführen, sucht Java nach der Klassendatei MyClass
in dem Verzeichnis oder den Verzeichnissen, die Sie in Ihrem CLASSPATH
und festgelegt haben nicht Ihr aktuelles Arbeitsverzeichnis, daher findet es Ihre Klassendatei dort nicht und beschwert sich daher.
Dazu müssen Sie Ihrem Klassenpfad erneut .
hinzufügen, was mit dem Befehl set CLASSPATH=%CLASSPATH%;.
geschehen kann (beachten Sie den Punkt nach dem Semikolon). Im Klartext sagt dieser Befehl: "Wählen Sie, was ursprünglich der Wert von CLASSPATH
(%CLASSPATH%
) war, fügen Sie .
hinzu (;.
) und weisen Sie das Ergebnis wieder CLASSPATH
".
Und voila , Sie können Ihren Befehl Java MyClass
wieder wie gewohnt verwenden.