Ein häufiges Problem, das neue Java-Entwickler haben, ist, dass ihre Programme nicht mit der 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?
Ein häufiges Problem, das neue Java-Entwickler haben, ist, dass ihre Programme nicht mit der 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?
Antworten:
java <class-name>
BefehlssyntaxZunächst müssen Sie wissen, wie Sie ein Programm mit dem Programm richtig starten java
javaw
Befehl (oder ) .
Die normale Syntax 1 lautet:
java [ <options> ] <class-name> [<arg> ...]
Dabei <option>
handelt es sich um eine Befehlszeilenoption (beginnend mit einem "-"), <class-name>
einen vollständig qualifizierten Java-Klassennamen und <arg>
ein beliebiges Befehlszeilenargument, das an Ihre Anwendung übergeben wird.
1 - Es gibt einige andere Syntaxen, die am Ende dieser Antwort beschrieben werden.
Der vollständig qualifizierte Name (FQN) für die Klasse wird herkömmlicherweise wie im Java-Quellcode geschrieben. z.B
packagename.packagename2.packagename3.ClassName
In einigen Versionen des java
Befehls können Sie jedoch Schrägstriche anstelle von Punkten verwenden. z.B
packagename/packagename2/packagename3/ClassName
das (verwirrenderweise) wie ein Dateipfadname aussieht, aber keiner ist. Beachten Sie, dass der Begriff vollqualifizierter Name" die Standard-Java-Terminologie ist ... nicht etwas, das ich mir nur ausgedacht 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 wird das verursachen java
Befehl Folgendes ausführt:
com.acme.example.ListUsers
Klasse.main
Methode mit Signatur , Rückgabetyp und verfügt Modifikatoren von verfügt public static void main(String[])
. (Beachten Sie, dass der Name des Methodenarguments NICHT lautet Teil der Signatur ist.)String[]
.Wenn Sie die Meldung "Hauptklasse konnte nicht gefunden oder geladen werden ..." erhalten, bedeutet dies, dass der erste Schritt fehlgeschlagen ist. Der java
Befehl konnte die Klasse nicht finden. Tatsächlich ist das "..." in der Nachricht der vollständig qualifizierte Klassenname , java
nach dem gesucht wird.
Warum kann es also nicht möglich sein, die Klasse zu finden?
Die erste wahrscheinliche 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 verschiedene falsche Möglichkeiten , den Klassennamen anzugeben:
Beispiel 1 - ein einfacher Klassenname:
java ListUser
Wenn die Klasse in einem Paket wie deklariert ist com.acme.example
, müssen Sie den vollständigen Klassennamen einschließlich des Paketnamens im java
Befehl 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 falschem Gehäuse:
java com.acme.example.listuser
Beispiel 4 - ein Tippfehler
java com.acme.example.mistuser
Beispiel 5 - ein Quelldateiname (außer Java 11 oder höher; siehe unten)
java ListUser.java
Beispiel 6 - Sie haben den Klassennamen vollständig vergessen
java lots of arguments
Die zweite wahrscheinliche Ursache ist, dass der Klassenname korrekt ist, der java
Befehl die Klasse jedoch nicht finden kann. Um dies zu verstehen, müssen Sie das Konzept des "Klassenpfades" verstehen. Dies erklärt sich auch durch die Oracle - Dokumentation:
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
Befehls wirksam ist . Überprüfen Sie, ob die Verzeichnisnamen und JAR-Dateinamen korrekt sind.java
Befehls 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 erhalten Sie eine nicht vorhandene Datei oder ein nicht vorhandenes 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 diesem Stammverzeichnis, indem der vollständig qualifizierte Name einem Pfadnamen zugeordnet wird . Wenn sich beispielsweise "/ usr / local / acme / classes" im Klassenpfad befindet, sucht die JVM beim Suchen nach einer aufgerufenen Klasse com.acme.example.Foon
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 eingefügt hätten, könnte die JVM die Klasse nicht finden.
Wenn Ihre Klassen FQN sind com.acme.example.Foon
, sucht die JVM im Verzeichnis "com / acme / example" nach "Foon.class":
Wenn Ihre Verzeichnisstruktur nicht mit der Paketbenennung gemäß dem obigen Muster übereinstimmt, findet die JVM Ihre Klasse nicht.
Wenn Sie versuchen , eine Klasse durch Verschieben umzubenennen , schlägt dies ebenfalls fehl. Die Ausnahme-Stacktrace ist jedoch anders. Es kann so etwas sagen:
Caused by: java.lang.NoClassDefFoundError: <path> (wrong name: <name>)
weil der FQN in der Klassendatei nicht mit dem übereinstimmt, was der Klassenlader erwartet zu finden.
Um ein konkretes Beispiel zu geben, vorausgesetzt:
com.acme.example.Foon
Klasse laufen lassen ,/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
Option kann -cp
in den meisten Java-Versionen verkürzt werden . Überprüfen Sie die entsprechenden manuellen Eingaben für java
, javac
und so weiter.Der Klassenpfad muss alle anderen (Nicht-System-) Klassen enthalten, von denen Ihre Anwendung abhängt. (Die Systemklassen werden automatisch lokalisiert, und Sie müssen sich selten damit befassen.) Damit die Hauptklasse korrekt geladen werden kann, muss die JVM Folgendes finden:
(Hinweis: Die JLS- und JVM-Spezifikationen ermöglichen es einer JVM, Klassen "träge" zu laden. Dies kann sich auswirken, wenn eine Classloader-Ausnahme ausgelöst wird.)
Es kommt gelegentlich vor, dass jemand eine Quellcodedatei in den falschen Ordner in seinem Quellcodebaum legt oder die package
Deklaration weglässt. Wenn Sie dies in einer IDE tun, werden Sie vom Compiler der IDE sofort darüber informiert. Wenn Sie ein anständiges Java-Build-Tool verwenden, wird das Tool javac
auf eine Weise ausgeführt, die das Problem erkennt. Wenn Sie Ihren Java-Code jedoch 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 ist, die Sie erwarten.
Es gibt viele Dinge zu überprüfen, und es ist leicht, etwas zu übersehen. Versuchen Sie, die -Xdiag
Option zur java
Befehlszeile hinzuzufügen (als erstes danach java
). Es werden verschiedene Dinge über das Laden von Klassen ausgegeben, und dies kann Ihnen Hinweise darauf geben, was das eigentliche Problem ist.
Berücksichtigen Sie auch mögliche Probleme, die durch das Kopieren und Einfügen unsichtbarer oder Nicht-ASCII-Zeichen von Websites, Dokumenten usw. verursacht werden. Und denken Sie an "Homoglyphen", bei denen zwei Buchstaben oder Symbole gleich aussehen ... aber nicht.
Schließlich können Sie anscheinend auf dieses Problem stoßen, wenn Sie versuchen, von einer JAR-Datei mit falschen Signaturen in zu starten (META-INF/*.SF)
.
java
Es gibt drei alternative Syntaxen zum Starten von Java-Programmen mit java command
.
1) Die zum Starten einer "ausführbaren" JAR-Datei verwendete Syntax lautet wie folgt:
java [ <options> ] -jar <jar-file-name> [<arg> ...]
z.B
java -Xmx100m -jar /usr/local/acme-example/listuser.jar fred
Der Name der Einstiegspunktklasse (dh com.acme.example.ListUser
) und der Klassenpfad werden im MANIFEST der JAR-Datei angegeben.
2) Die Syntax zum Starten einer Anwendung von einem Modul (Java 9 und höher) lautet wie folgt:
java [ <options> ] --module <module>[/<mainclass>] [<arg> ...]
Der Name der Einstiegspunktklasse wird entweder durch das Selbst definiert <module>
oder durch das Optionale angegeben <mainclass>
.
3) Ab Java 11 können Sie eine einzelne Quellcodedatei kompilieren, ausführen und mit der folgenden Syntax ausführen:
java [ <options> ] <sourcefile> [<arg> ...]
Wo ist (normalerweise) eine Datei mit dem Suffix ".java".
Weitere Informationen finden Sie in der offiziellen Dokumentation zum java
Befehl für die von Ihnen verwendete Java-Version.
Eine typische Java-IDE unterstützt das Ausführen von Java-Anwendungen in der IDE-JVM selbst oder in einer untergeordneten JVM. Diese sind im Allgemeinen gegen diese spezielle Ausnahme immun, da die IDE ihre eigenen Mechanismen verwendet, um den Laufzeitklassenpfad zu erstellen, die Hauptklasse zu identifizieren und die java
Befehlszeile zu erstellen .
Es ist jedoch weiterhin möglich, dass diese Ausnahme auftritt, wenn Sie Dinge hinter der Rückseite der IDE ausführen. Wenn Sie beispielsweise zuvor in Eclipse einen Application Launcher für Ihre Java-App eingerichtet und dann die JAR-Datei mit der Hauptklasse an eine andere Stelle im Dateisystem verschoben haben, ohne Eclipse mitzuteilen, würde Eclipse die JVM unbeabsichtigt starten mit einem falschen Klassenpfad.
Kurz gesagt, wenn dieses Problem in einer IDE auftritt, suchen Sie nach veralteten IDE-Status, fehlerhaften Projektreferenzen oder fehlerhaften Startkonfigurationen.
Es ist auch möglich, dass eine IDE einfach verwirrt wird. IDEs sind äußerst komplizierte Softwareteile, die viele interagierende Teile umfassen. Viele dieser Teile verwenden verschiedene Caching-Strategien, um die IDE als Ganzes reaktionsfähig zu machen. Diese können manchmal schief gehen, und ein mögliches Symptom sind Probleme beim Starten von Anwendungen. Wenn Sie den Verdacht haben, dass dies passieren könnte, sollten Sie andere Dinge ausprobieren, z. B. den Neustart Ihrer IDE, die Neuerstellung des Projekts usw.
java -cp ../third-party-library.jar com.my.package.MyClass
; Dies funktioniert nicht, stattdessen muss der lokale Ordner ebenfalls zum Klassenpfad hinzugefügt werden (getrennt durch :
: java -cp ../third-party-library.jar:. com.my.package.MyClass
, dann sollte es funktionieren
java
nicht gesagt wird, dass keine importierte Klasse gefunden wird, sondern die Hauptklasse, die Sie ausführen möchten. Das ist irreführend, obwohl ich sicher bin, dass es dafür einen Grund gibt. Ich hatte den Fall, in java
dem ich genau wusste, wo sich meine Klasse befindet, konnte jedoch keine der importierten Klassen finden. Anstatt das zu sagen, beschwerte es sich darüber, meine Hauptklasse nicht zu finden. Wirklich, nervig.
Wenn Ihr Quellcode HelloWorld.java lautet, lautet Ihr kompilierter Code HelloWorld.class
.
Sie erhalten diesen Fehler, wenn Sie ihn aufrufen mit:
java HelloWorld.class
Verwenden Sie stattdessen Folgendes:
java HelloWorld
javac TestCode.java
gefolgt vonjava TestCode
java -classpath . HelloWorld
Wenn Ihre Klassen in Paketen sind, müssen Siecd
in das Stammverzeichnis Ihres Projekts wechseln und den vollständig qualifizierten Namen der Klasse (packageName.MainClassName) verwenden.
Beispiel:
Meine Klassen sind hier:
D:\project\com\cse\
Der vollqualifizierte Name meiner Hauptklasse lautet:
com.cse.Main
Also gehe ich cd
zurück zum Stammprojektverzeichnis:
D:\project
Geben Sie dann den folgenden java
Befehl ein:
java com.cse.Main
Diese Antwort dient dazu, neue Java-Programmierer vor der Frustration zu retten, die durch einen häufigen Fehler verursacht wurde. Ich empfehle Ihnen, die akzeptierte Antwort zu lesen, um mehr über den Java-Klassenpfad zu erfahren.
Wenn Sie die Hauptklasse und die Hauptmethode in a definierenpackage
, 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 ihn Main.Class
in das paketähnliche Verzeichnis einfügen ./com/test/Main.Java
. Und im Stammverzeichnis verwenden java com.test.Main
.
Wenn derselbe Code auf einem PC funktioniert, aber der Fehler auf einem anderen PC angezeigt wird, ist die beste Lösung, die ich je gefunden habe, das Kompilieren wie folgt:
javac HelloWorld.java
java -cp . HelloWorld
javac -classpath . HelloWorld.java
hätte es geklappt! Und das ist in Ihrem Fall eine bessere Lösung.
Was mir geholfen hat, war die Angabe des Klassenpfads in der Befehlszeile, zum Beispiel:
Einen neuen Ordner erstellen, C:\temp
Erstellen Sie die Datei Temp.java 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 Java-Klasse aus und fügen Sie die -classpath
Option hinzu, um JRE mitzuteilen, wo sich die Klasse befindet:
java -classpath C:\temp Temp Hello!
java
$ CLASSPATH wurde nicht angezeigt (weil Sie -classpath oder -jar verwendet haben) oder 2) die Klassenpfadeinstellung wurde nicht in der Umgebung festgelegt, die im jeweiligen Kontext nicht wirksamjava
war Lauf; zB weil Sie die Datei nicht "quelliert" haben, in der die setenv-Befehle in der rechten Shell hinzugefügt wurden.
Gemäß der Fehlermeldung ("Hauptklasse konnte nicht gefunden oder geladen werden") gibt es zwei Kategorien von Problemen:
Die Hauptklasse konnte nicht gefunden werden, wenn der vollständig qualifizierte Klassenname einen Tippfehler oder eine falsche Syntax enthält oder im angegebenen Klassenpfad nicht vorhanden ist .
Hauptklasse konnte nicht geladen werdenDie Hauptklasse wenn die Klasse nicht initiiert werden kann. In der Regel erweitert die Hauptklasse eine andere Klasse und diese Klasse ist im angegebenen Klassenpfad nicht vorhanden.
Zum Beispiel:
public class YourMain extends org.apache.camel.spring.Main
Wenn die Kamelfeder nicht enthalten ist, wird dieser Fehler gemeldet.
extends
). Ich habe gerade auf die harte Tour gelernt, dass Java nicht meldet, welche tatsächliche Klasse nicht gefunden wurde (im Gegensatz zu ) , wenn die Hauptklasse nicht geladen werden kann, weil sie eine andere erweitert, die nicht gefunden werden konnte . Also ja, es passiert und es ist eine haarsträubende Situation, wenn Sie das nicht wissen. NoClassDefFoundError
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
Main
sich nicht in der JAR-Datei befinden. -cp lib.jar;
bedeutet dasselbe wie -cp lib.jar;.
dh das aktuelle Verzeichnis ist im Klassenpfad enthalten.
Versuchen Sie -Xdiag .
Die Antwort von Steve C deckt die möglichen Fälle gut ab, aber manchmal ist es nicht so einfach festzustellen, ob die Klasse nicht gefunden oder geladen werden konnte. Verwenden Sie java -Xdiag
(seit JDK 7). Dies druckt eine schöne Stapelverfolgung aus, die einen Hinweis darauf gibt, was die Could not find or load main class
Nachrichtennachricht bedeutet.
Beispielsweise kann es Sie auf andere Klassen verweisen, die von der Hauptklasse verwendet werden und nicht gefunden werden konnten, und das Laden der Hauptklasse verhindern.
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
Bei JDK 8 kommt es häufig vor, dass sich die Klassendatei im selben Ordner befindet, der java
Befehl jedoch einen Klassenpfad erwartet. Aus diesem Grund wird -cp .
der aktuelle Ordner als Referenz für den Klassenpfad verwendet.
-cp .
ist dies nicht erforderlich, denn wenn dies nicht festgelegt $CLASSPATH
ist, .
ist dies der Standardklassenpfad.
echo %CLASSPATH%
Ausgabe aus?) Und nein, ich kann nicht überprüfen, weil ich keinen Windows-PC habe.
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 Bibliothek, auf die verwiesen wurde und die mir Folgendes gab:
Hauptklasse xxx Linux konnte nicht gefunden oder geladen werden
Ich habe gerade diese Referenz gelöscht, sie erneut hinzugefügt und sie hat wieder einwandfrei funktioniert.
In diesem Fall haben Sie:
Hauptklasse ? Klassenpfad konnte nicht gefunden oder geladen werden
Dies liegt daran, dass Sie "-classpath" verwenden, der Bindestrich jedoch nicht mit dem Bindestrich übereinstimmt, der java
an der Eingabeaufforderung verwendet wird. Ich hatte dieses Problem beim Kopieren und Einfügen von Notepad nach cmd.
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 (ich konnte die Hauptklasse nicht finden oder laden qrcode
):
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 nur das Zeichen ':' am Ende des Klassenpfads hinzugefügt und das Problem wurde gelöst:
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
In meinem Fall trat ein Fehler auf, weil ich den Namen der Quelldatei anstelle des Klassennamens angegeben hatte.
Wir müssen dem Interpret den Klassennamen mit der Hauptmethode geben.
Dies kann Ihnen helfen, wenn Ihr Fall speziell meinem entspricht: Als Anfänger bin ich auch auf dieses Problem gestoßen, als ich versucht habe, ein Java-Programm 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 .java
den Befehl entfernte und neu schrieb java HelloWorld
, lief das Programm perfekt. :) :)
Alle Antworten hier richten sich anscheinend an Windows-Benutzer. Für Mac ist das Klassenpfadtrennzeichen :
nicht ;
. Als Fehler beim Einstellen des Klassenpfads mit;
nicht ausgelöst wird, kann es schwierig sein, dies zu erkennen, wenn Sie von Windows auf Mac kommen.
Hier ist der entsprechende Mac-Befehl:
java -classpath ".:./lib/*" com.test.MyClass
Wo in diesem Beispiel das Paket ist com.test
und ein lib
Ordner auch im Klassenpfad enthalten sein soll.
/*
ist notwendig?
Speicherort der Klassendatei: C: \ test \ com \ company
Dateiname: Main.class
Vollqualifizierter Klassenname: com.company.Main
Befehlszeilenbefehl:
java -classpath "C:\test" com.company.Main
Beachten Sie hier, dass der Klassenpfad NICHT \ com \ company enthält
Ich habe ziemlich viel Zeit damit verbracht, dieses Problem zu lösen. Ich dachte, dass ich meinen Klassenpfad irgendwie falsch eingestellt habe, aber das Problem war, dass ich Folgendes eingegeben habe:
java -cp C:/java/MyClasses C:/java/MyClasses/utilities/myapp/Cool
anstatt:
java -cp C:/java/MyClasses utilities/myapp/Cool
Ich dachte, die Bedeutung von voll qualifiziert bedeutet, den vollständigen Pfadnamen anstelle des vollständigen Paketnamens einzuschließen.
utilities.myapp.Cool
oder wie auch immer der Paketname angegeben werden.
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 (Ordnername)" in das gespeicherte Laufwerk ein und kompilieren Sie es. Wenn mein Programm beispielsweise auf dem Laufwerk D gespeichert ist, geben Sie "D:" ein, drücken Sie die Eingabetaste und geben Sie "cd (Ordnername)" ein.
if "cd" helps then it by luck rather than by judgement
. Dies ist falsch (glaube ich), da Java standardmäßig das aktuelle Verzeichnis .
als Teil des Klassenpfads verwendet.
Was das Problem in meinem Fall behoben hat, war:
Klicken Sie mit der rechten Maustaste auf das Projekt / die Klasse, die Sie ausführen möchten, und klicken Sie dann auf Run As
-> Run Configurations
. Dann sollten Sie entweder Ihre vorhandene Konfiguration korrigieren oder auf folgende Weise neue hinzufügen:
Öffnen Sie die Classpath
Registerkarte, klicken Sie auf die Advanced...
Schaltfläche und fügen Sie den bin
Ordner Ihres Projekts hinzu.
Wenn Sie die JAR-Datei mit Maven erstellen, 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>
Dies ist ein spezieller Fall, aber da ich auf dieser Seite nach einer Lösung gesucht habe und sie nicht gefunden habe, werde ich sie hier hinzufügen.
Windows (getestet mit 7) akzeptiert keine Sonderzeichen (wie á
) in Klassen- und Paketnamen. Linux tut es jedoch.
Ich habe dies herausgefunden, als ich ein .jar
in NetBeans erstellt und versucht habe, es in der Befehlszeile auszuführen. Es lief in NetBeans, aber nicht in der Kommandozeile.
Unter Windows setzen Sie .;
am Anfang den Wert CLASSPATH.
Das . (Punkt) bedeutet "im aktuellen Verzeichnis suchen". Dies ist eine dauerhafte Lösung.
Sie können es auch "einmal" mit set einstellen CLASSPATH=%CLASSPATH%;.
. Dies dauert so lange, wie Ihr cmd-Fenster geöffnet ist.
Sie müssen dies wirklich aus dem src
Ordner tun . Dort geben Sie folgende Befehlszeile ein:
[name of the package].[Class Name] [arguments]
Angenommen, 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 gehen und der Befehl, den Sie ausführen müssen, würde folgendermaßen aussehen:
java com.tutorialspoint.java.CommandLine this is a command line 200 -100
Und die Ausgabe in der Kommandozeile wäre:
args[0]: this
args[1]: is
args[2]: a
args[3]: command
args[4]: line
args[5]: 200
args[6]: -100
cd
in src
und dann den Befehl ausführen , java ../bin com.blah.blah.MyClass
die für mich gearbeitet. Also danke für den Tipp!
Wenn Sie in Java die JVM manchmal über die Befehlszeile mit der ausführbaren Java-Datei ausführen und versuchen, ein Programm aus einer Klassendatei mit PSVM (Public Static Void Main) zu starten, tritt möglicherweise der folgende Fehler auf, obwohl der Parameter classpath to Die JVM ist korrekt und die Klassendatei befindet sich im Klassenpfad:
Error: main class not found or loaded
Dies geschieht, 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. Wenn sich eine Klasse nicht im Klassenpfad befindet, wird der ausgelöste Fehler normalerweise als solche 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/
Wenn Sie java
die -cp
Option mit der in Windows PowerShell angegebenen Option ausführen, wird möglicherweise ein Fehler angezeigt, der ungefähr so aussieht:
The term `ClassName` is not recognized as the name of a cmdlet, function, script ...
Damit PowerShell den Befehl akzeptiert, müssen die Argumente der -cp
Option 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 traten ähnliche Fehler auf. Ich denke, es ist gut, meine endgültige Lösung kurz zusammenzufassen, damit in Zukunft jeder direkt in die beiden Befehle schauen und weiter vorgehen kann.
Angenommen, Sie befinden sich in dem Verzeichnis, in dem Ihre Java-Datei und externe Abhängigkeiten (JAR-Dateien) vorhanden sind.
Kompilieren:
javac -cp mongo-java-driver-3.4.1.jar JavaMongoDBConnection.java
Lauf:
java -cp mongo-java-driver-3.4.1.jar: JavaMongoDBConnection
JavaMongoDBConnection
kein Paket vorhanden ist und 2) Sie das Verzeichnis nicht wechseln. Es ist gelinde gesagt zerbrechlich. Und wenn die Probleme nicht erklärt werden, können Neulinge diesen Ansatz in Situationen ausprobieren, in denen er nicht funktioniert . Kurz gesagt, es fördert "Voodoo-Programmiertechniken": en.wikipedia.org/wiki/Voodoo_programming
In Ordnung, es gibt bereits viele Antworten, aber niemand erwähnte den Fall, in dem Dateiberechtigungen der Schuldige sein können.
Während der Ausführung hat ein Benutzer möglicherweise keinen Zugriff auf die JAR-Datei oder eines der Verzeichnisse des Pfads. Betrachten Sie zum Beispiel:
Jar Datei in /dir1/dir2/dir3/myjar.jar
Benutzer1, dem die JAR-Datei gehört, kann Folgendes tun:
# 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 laufende Benutzer (Benutzer2) keinen Zugriff auf dir1, dir2 oder javalibs oder dir3 hat. Es kann jemanden verrückt machen, wenn Benutzer1 die Dateien sehen und darauf zugreifen kann, aber der Fehler tritt immer noch für Benutzer2 auf.
Ich habe diesen Fehler erhalten, nachdem ich dies getan habe. mvn eclipse:eclipse
Dies hat meine .classpath
Datei ein wenig durcheinander gebracht .
Musste die Zeilen .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" />
Ich konnte dieses Problem mit den hier angegebenen Lösungen nicht lösen (obwohl die angegebene Antwort zweifellos meine Konzepte geklärt hat). Ich war zweimal mit diesem Problem konfrontiert und habe jedes Mal verschiedene Lösungen ausprobiert (in der Eclipse-IDE).
main
Methoden in verschiedenen Klassen meines Projekts gestoßen. Also hatte ich die main
Methode aus nachfolgenden Klassen gelöscht .main
Methoden behebt das Problem nicht. An einer Anwendung mit mehreren Einstiegspunkten ist technisch nichts auszusetzen.