Ich habe ein HelloWorld-Programm kompiliert und verwende die Eingabeaufforderung, um es auszuführen. Die .class-Datei heißt HelloWorld2.class
Die Datei befindet sich in C: \ Users \ Matt \ workspace \ HelloWorld2 \ bin. Folgendes erhalte ich, wenn ich zur Eingabeaufforderung gehe und "Java HelloWorld2" eingebe:
C:\Users\Matt>Java HelloWorld2
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld2
Caused by: java.lang.ClassNotFoundException: HelloWorld2
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: HelloWorld2. Program will exit.
Ich hatte erwartet, dass eine HelloWorld ausgedruckt wird. Was mache ich falsch? Ich habe das JDK installiert.
java
compilation
Skizz
quelle
quelle
Antworten:
Sie müssen den Klassenpfad festlegen, um Ihre kompilierte Klasse zu finden:
java -cp C:\Users\Matt\workspace\HelloWorld2\bin HelloWorld2
quelle
So führen Sie die Java-Klassendatei über die Befehlszeile aus:
Dabei ist packageName (normalerweise mit entweder
com
oderorg
) der Ordnername, in dem Ihre Klassendatei vorhanden ist.Wenn Ihr Hauptklassenname beispielsweise App und der Java-Paketname Ihrer App lautet
com.foo.app
, muss sich Ihre Klassendatei imcom/foo/app
Ordner befinden (separater Ordner für jeden Punkt), damit Sie Ihre App wie folgt ausführen können:Hinweis:
$
Zeigt eine Shell-Eingabeaufforderung an. Ignorieren Sie diese bei der EingabeWenn für Ihre Klasse kein
package
Name definiert ist, führen Sie einfach Folgendes aus :java App
.Wenn Sie andere JAR-Abhängigkeiten haben, stellen Sie sicher, dass Sie Ihren Klassenpfadparameter entweder mit
-cp
/-classpath
oder mit einerCLASSPATH
Variablen angegeben haben, die auf den Ordner mit Ihren JAR- / War- / Ear- / Zip- / Klassendateien verweist . Unter Linux können Sie dem Befehl also Folgendes voranstellen: UnterCLASSPATH=/path/to/jars
Windows müssen Sie den Ordner zur Systemvariablen hinzufügen. Wenn nicht festgelegt, besteht der Benutzerklassenpfad aus dem aktuellen Verzeichnis (.
).Praktisches Beispiel
Vorausgesetzt, wir haben ein Beispielprojekt mit Maven erstellt als:
$ mvn archetype:generate -DgroupId=com.foo.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
und wir haben unser Projekt
mvn compile
in unseremmy-app/
Verzeichnis kompiliert , es wird unsere Klassendatei in generierentarget/classes/com/foo/app/App.class
.Um es auszuführen, können wir entweder den Klassenpfad über angeben
-cp
oder direkt dorthin gehen. Überprüfen Sie die folgenden Beispiele:$ find . -name "*.class" ./target/classes/com/foo/app/App.class $ CLASSPATH=target/classes/ java com.foo.app.App Hello World! $ java -cp target/classes com.foo.app.App Hello World! $ java -classpath .:/path/to/other-jars:target/classes com.foo.app.App Hello World! $ cd target/classes && java com.foo.app.App Hello World!
Um Ihren Klassen- und Paketnamen zu überprüfen, können Sie das Java-Klassendateidisassembler-Tool verwenden, z.
$ javap target/classes/com/foo/app/App.class Compiled from "App.java" public class com.foo.app.App { public com.foo.app.App(); public static void main(java.lang.String[]); }
Hinweis: Funktioniert
javap
nicht, wenn die kompilierte Datei verschleiert wurde.quelle
Dies kann viele Dinge bedeuten, aber die häufigste ist, dass die in der Datei enthaltene Klasse nicht denselben Namen wie die Datei selbst hat. Überprüfen Sie also, ob Ihre Klasse auch HelloWorld2 heißt.
quelle
C:/blah/blah/foldercontainJava
javac javafile.java
quelle
Sie müssen Java in Kleinbuchstaben setzen und .class hinzufügen!
quelle