Wie führe ich eine Java-class über die Befehlszeile aus?

Ich habe eine kompilierte Java-class:

Echo.class

public class Echo { public static void main (String arg) { System.out.println(arg); } } 

Ich cd in das Verzeichnis und geben Sie ein: java Echo "hello"

Ich bekomme 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, meinen Java-Code in eine Form zu bringen, die ich von der Kommandozeile ausführen kann, wenn ich Eclipse-IDE verwenden möchte?

Versuchen:

 java -cp . Echo "hello" 

Angenommen, Sie haben Folgendes kompiliert:

 javac Echo.java 

Dann besteht die Möglichkeit, dass das “aktuelle” Verzeichnis nicht in Ihrem classnpfad ist (wo Java nach .class-Definitionen sucht)

Wenn das der Fall ist und den Inhalt Ihres Verzeichnisses auflistet:

 Echo.java Echo.class 

Dann könnte irgendetwas davon funktionieren:

 java -cp . Echo "hello" 

oder

 SET CLASSPATH=%CLASSPATH;. java Echo "hello" 

Und später, als Fredrik darauf hinweist, erhalten Sie eine weitere Fehlermeldung wie.

Ausnahme im Thread “main” java.lang.NoSuchMethodError: main

Wenn das passiert, lesen Sie seine Antwort 🙂

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

 java -cp . Echo "hello" 

Dies sagt Java zu verwenden . (das aktuelle Verzeichnis) als classnpfad, dh der Ort, an dem nach classn gesucht wird. Hinweis: Wenn Sie Pakete verwenden, muss der classnpfad das Stammverzeichnis und nicht die Unterverzeichnisse des Pakets enthalten. Wenn Ihre class beispielsweise my.package.Echo und die .class-Datei bin/my/package/Echo.class , ist das korrekte classnpfadverzeichnis bin .

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

Daher sollte der Code in Ihrem Fall so aussehen:

 public class Echo { public static void main (String[] arg) { System.out.println(arg[0]); } } 

Edit: Bitte beachten Sie, dass Oscar auch darin liegt, dass Sie vermisst werden. In Ihrem classnpfad würden Sie auf das Problem stoßen, das ich getriggers habe, nachdem Sie diesen Fehler behoben haben.

Es könnte verschiedene Fehler geben – hier ist ein Tutorial, das Ihnen den Einstieg erleichtern sollte: Java als Befehlszeilenanwendung ausführen .

Meine Situation war ein wenig kompliziert. Ich musste drei Schritte machen, seit ich eine. DLL im Resources-Verzeichnis für JNI-Code verwendet habe. 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 Classpath-Verzeichnis wechseln

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

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

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

Dann musste ich Java mit dem classnnamen ausführen.

 java com.accessibility.HelloWorld 

Wenn Sie in Ihrer Java-Quelle haben

 package mypackage; 

und deine class ist hallo.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 deine hello.class befindet. Dann

 java -cp . mypackage.hello 

Berücksichtigen Sie das aktuelle Verzeichnis und den Paketnamen vor dem classnnamen. Es funktioniert für meine auf Linux-Minze und ich hoffe auf die anderen os ist auch

Danke Stack Overflow für eine Fülle von Informationen.

Zuerst haben Sie die class mit dem Kommandozeilen-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){ 

Sobald Sie Ihren Code geändert haben, um ein Array von String-Objekten aufzunehmen, 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();