Wie führe ich Java .class-Dateien aus?

79

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.

Skizz
quelle
9
Zusätzlich zu Isaacs Antwort auf Ihr Problem. Es kann eine gute Idee sein, "Java" in Kleinbuchstaben zu schreiben, da Großbuchstaben nur unter MS Windows funktionieren.
Hendrik Brummermann

Antworten:

92

Sie müssen den Klassenpfad festlegen, um Ihre kompilierte Klasse zu finden:

java -cp C:\Users\Matt\workspace\HelloWorld2\bin HelloWorld2

Isaac Truett
quelle
Es funktioniert perfekt von überall in meiner Dateistruktur. Fügen Sie einfach den Pfad zur kompilierten Klasse in einen -cp-Parameter und dann den Namen der kompilierten Klasse ohne Pfad ein. Sie können diese Klasse auch ohne den Parameter -cp ausführen, wenn Sie sich im selben Ordner wie Ihre kompilierte Klasse befinden.
Václav
40

So führen Sie die Java-Klassendatei über die Befehlszeile aus:

java -classpath /path/to/jars <packageName>.<MainClassName>

Dabei ist packageName (normalerweise mit entweder comoder org) 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 im com/foo/appOrdner befinden (separater Ordner für jeden Punkt), damit Sie Ihre App wie folgt ausführen können:

$ java com.foo.app.App

Hinweis: $Zeigt eine Shell-Eingabeaufforderung an. Ignorieren Sie diese bei der Eingabe

Wenn für Ihre Klasse kein packageName 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/ -classpathoder mit einer CLASSPATHVariablen angegeben haben, die auf den Ordner mit Ihren JAR- / War- / Ear- / Zip- / Klassendateien verweist . Unter Linux können Sie dem Befehl also Folgendes voranstellen: Unter CLASSPATH=/path/to/jarsWindows 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 compilein unserem my-app/Verzeichnis kompiliert , es wird unsere Klassendatei in generieren target/classes/com/foo/app/App.class.

Um es auszuführen, können wir entweder den Klassenpfad über angeben -cpoder 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 javapnicht, wenn die kompilierte Datei verschleiert wurde.

Kenorb
quelle
2

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.

Federico Vera
quelle
0
  1. Gehen Sie zu dem Pfad, in dem Sie die Java-Datei gespeichert haben, die Sie kompilieren möchten.
  2. Ersetzen Sie den Pfad durch Eingabe von cmd und drücken Sie die Eingabetaste.
  3. Das Eingabeaufforderungsverzeichnis wird mit der Pfaddatei wie angezeigt C:/blah/blah/foldercontainJava
  4. Eingeben javac javafile.java
  5. Drücken Sie Enter. Es wird automatisch eine Java-Klassendatei generiert
Geruchsgeschichte
quelle
-3

Sie müssen Java in Kleinbuchstaben setzen und .class hinzufügen!

java HelloWorld2.class
Corni
quelle