So führen Sie eine Java-Klasse über die Befehlszeile aus

112

Ich habe eine kompilierte Java-Klasse:

Echo.class

public class Echo {
    public static void main (String arg) {

            System.out.println(arg);
    }
}

Ich gehe cdin das Verzeichnis und gebe ein:java Echo "hello"

Ich erhalte diesen Fehler:

C:\Documents and Settings\joe\My Documents\projects\Misc\bin>java Echo "hello"
Exception in thread "main" java.lang.NoClassDefFoundError: Echo
Caused by: java.lang.ClassNotFoundException: Echo
        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)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)
Could not find the main class: Echo.  Program will exit.

Was ist der einfachste Weg, um meinen Java-Code in einer Form abzurufen, die ich über die Befehlszeile ausführen kann, wenn ich Eclipse IDE verwenden muss?

Joe
quelle
14
Vorschlag: Die ursprüngliche Frage sollte möglicherweise besser unbearbeitet bleiben, um die Antworten nach einer kurzen Überprüfung nicht ungültig zu machen. Wirklich seltsam, die richtige Methodensignatur und dann eine Reihe von Antworten zu sehen, die besagen, dass sie falsch waren. Es soll fehlerhafter Code übrig bleiben, der zumindest zum Vergleich mit der richtigen Version dient.
JSmyth

Antworten:

118

Versuchen:

java -cp . Echo "hello"

Angenommen, Sie haben kompiliert mit:

javac Echo.java 

Dann besteht die Möglichkeit, dass sich das "aktuelle" Verzeichnis nicht in Ihrem Klassenpfad befindet (wo Java nach .class-Definitionen sucht).

Wenn dies der Fall ist und der Inhalt Ihres Verzeichnisses aufgelistet wird, wird Folgendes angezeigt:

Echo.java
Echo.class

Dann kann alles funktionieren:

java -cp . Echo "hello"

oder

SET CLASSPATH=%CLASSPATH;.  

java Echo "hello"

Und später, wie Fredrik betont, erhalten Sie eine weitere Fehlermeldung wie.

Ausnahme im Thread "main" java.lang.NoSuchMethodError: main

Wenn das passiert, lies seine Antwort :)

OscarRyz
quelle
2
Das -cp. um Java zu sagen, dass er hinzufügen sollte. (aktuelles Arbeitsverzeichnis) zum Klassenpfad, dh dem Ort, an dem er nach Code sucht.
Fredrik
16

Sie müssen den Klassenpfad angeben. Dies sollte es tun:

java -cp . Echo "hello"

Dies weist Java an, .(das aktuelle Verzeichnis) als Klassenpfad zu verwenden, dh den Ort, an dem nach Klassen gesucht wird. Beachten Sie, dass der Klassenpfad bei Verwendung von Paketen das Stammverzeichnis und nicht die Paketunterverzeichnisse enthalten muss. Beispiel: Wenn Ihre Klasse my.package.Echound die .class-Datei ist bin/my/package/Echo.class, ist das richtige Klassenpfadverzeichnis bin.

Michael Borgwardt
quelle
15

Sie haben keine gültige Hauptmethode ... Die Signatur sollte lauten: public static void main ( String [] args);

Daher sollte der Code in Ihrem Fall folgendermaßen aussehen:

public class Echo {
    public static void main (String[] arg) {

            System.out.println(arg[0]);
    }
}

Bearbeiten: Bitte beachten Sie, dass Oscar auch insofern Recht hat, als Sie fehlen. In Ihrem Klassenpfad würden Sie auf das Problem stoßen, das ich löse, nachdem Sie diesen Fehler behoben haben.

Fredrik
quelle
15

Mit Java 11 müssen Sie dieses Rigmarole nicht mehr durchlaufen!

Stattdessen können Sie Folgendes tun:

> java MyApp.java

Sie müssen nicht vorher kompilieren, da alles in einem Schritt erledigt wird.

Sie können das Java 11 JDK hier herunterladen : JDK 11 GA Release

Ryan Lundy
quelle
> Kopieren Sie C: \ Desenv \ workspaceServer \ TestProject \ src \ WebServiceStandAlone \ MyApp.java. / y && javac MyApp.java && java -cp. MyApp && del MyApp.class && del MyApp.java Einige Leute bevorzugen die alte Mode =)
Jr.
3

Wenn Sie in Ihrer Java-Quelle haben

package mypackage;

und deine Klasse ist hello.java mit

public class hello {

und in diesem hallo.java hast du

 public static void main(String[] args) {

Dann (nach der Kompilierung) changeDir (cd) in das Verzeichnis, in dem sich Ihre hello.class befindet. Dann

java -cp . mypackage.hello

Beachten Sie das aktuelle Verzeichnis und den Paketnamen vor dem Klassennamen. Es funktioniert für meine Linux Mint und ich hoffe auch auf die anderen Betriebssysteme

Vielen Dank an Stack Overflow für eine Fülle von Informationen.

Gerard Doets
quelle
1
NB: Die Klassendatei sollte über den ./mypackage/hello.classNamen gefunden werden können. Siehe auch: Frage " Java im Paket über die Befehlszeile ausführen ".
Ruvim
2

Meine Situation war etwas kompliziert. Ich musste drei Schritte ausführen, da ich eine DLL im Ressourcenverzeichnis für JNI-Code verwendete. Meine Dateien waren

S:\Accessibility\tools\src\main\resources\dlls\HelloWorld.dll
S:\Accessibility\tools\src\test\java\com\accessibility\HelloWorld.class

Mein Code enthielt die folgende Zeile

System.load(HelloWorld.class.getResource("/dlls/HelloWorld.dll").getPath());

Zuerst musste ich in das Klassenpfadverzeichnis wechseln

cd /D "S:\Accessibility\tools\src\test\java"

Als nächstes musste ich den Klassenpfad so ändern, dass er auf das aktuelle Verzeichnis verweist, damit meine Klasse geladen wird, und ich musste den Klassenpfad so ändern, dass er auf das Ressourcenverzeichnis verweist, damit meine DLL geladen wird.

set classpath=%classpath%;.;..\..\..\src\main\resources; 

Dann musste ich Java mit dem Klassennamen ausführen.

java com.accessibility.HelloWorld 
Scott Izu
quelle
0

Haben Sie zuerst die Klasse mit dem Befehlszeilen-Javac-Compiler kompiliert? Zweitens scheint Ihre Hauptmethode eine falsche Signatur zu haben - sie sollte ein Array von String-Objekten aufnehmen und nicht nur eines:

public static void main(String[] args){

Wenn Sie Ihren Code so geändert haben, dass er ein Array von String-Objekten aufnimmt, müssen Sie sicherstellen, dass Sie ein Element des Arrays und nicht das Array selbst drucken:

System.out.println(args[0])

Wenn Sie die gesamte Liste der Befehlszeilenargumente drucken möchten, müssen Sie eine Schleife verwenden, z

for(int i = 0; i < args.length; i++){
    System.out.print(args[i]);
}
System.out.println();
Quantikel
quelle