Jak wykonać java .class z wiersza poleceń


113

Mam skompilowaną klasę java:

Echo.class

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

            System.out.println(arg);
    }
}

I cddo katalogu i wpisz:java Echo "hello"

Otrzymuję ten błąd:

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.

Jaki jest najprostszy sposób uzyskania kodu Java w formie, którą mogę uruchomić z wiersza poleceń, mając na uwadze konieczność korzystania z Eclipse IDE?


14
Sugestia: Być może lepiej byłoby pozostawić pierwotne pytanie bez redagowania, aby nie unieważniać odpowiedzi, w ramach szybkiego przeglądu. Naprawdę dziwne jest zobaczyć właściwą sygnaturę metody, a następnie kilka odpowiedzi, które mówią, że była niepoprawna. Ma to pozostać błędny kod, przynajmniej w celu porównania z poprawną wersją.
JSmyth,

Odpowiedzi:


119

Próbować:

java -cp . Echo "hello"

Zakładając, że skompilowałeś z:

javac Echo.java 

Istnieje wtedy prawdopodobieństwo, że „bieżący” katalog nie znajduje się w Twojej ścieżce klas (gdzie java szuka definicji .class)

W takim przypadku wyświetlona zostanie zawartość katalogu:

Echo.java
Echo.class

Wtedy wszystko może zadziałać:

java -cp . Echo "hello"

lub

SET CLASSPATH=%CLASSPATH;.  

java Echo "hello"

A później, jak zauważa Fredrik , pojawi się kolejny komunikat o błędzie, taki jak.

Wyjątek w wątku „main” java.lang.NoSuchMethodError: main

Kiedy to się stanie, idź i przeczytaj jego odpowiedź :)


2
Opcja -cp. powiedzieć Javie, że powinien dodać. (bieżący katalog roboczy) do ścieżki klas, czyli miejsca, w którym szuka kodu.
Fredrik

16

Musisz określić ścieżkę klasy. To powinno wystarczyć:

java -cp . Echo "hello"

To nakazuje Javie używanie .(bieżącego katalogu) jako ścieżki klas, czyli miejsca, w którym szuka klas. Uwaga: jeśli używasz pakietów, ścieżka klas musi zawierać katalog główny, a nie podkatalogi pakietu. np. jeśli Twoja klasa to, my.package.Echoa plik .class to bin/my/package/Echo.class, prawidłowy katalog ścieżki klas to bin.


15

Nie masz poprawnej metody main ... Podpis powinien wyglądać następująco: public static void main ( String [] args);

Dlatego w Twoim przypadku kod powinien wyglądać tak:

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

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

Edycja: Zwróć uwagę, że Oscar ma rację, że brakuje ci. w swojej ścieżce klas napotkałbyś problem, który rozwiązuję po rozwiązaniu tego błędu.


15

Z Javą 11 nie będziesz już musiał przechodzić przez tę trudną zagadkę!

Zamiast tego możesz to zrobić:

> java MyApp.java

Nie musisz wcześniej kompilować, ponieważ wszystko odbywa się w jednym kroku.

Możesz pobrać Java 11 JDK tutaj: JDK 11 GA Release


> skopiuj C: \ Desenv \ workspaceServer \ TestProject \ src \ WebServiceStandAlone \ MyApp.java. / y && javac MyApp.java && java -cp. MojaApl && && del MyApp.class del MyApp.java Niektórzy faceci wolą staromodny sposób =)
Jr

3

Jeśli masz w swoim źródle java

package mypackage;

a twoja klasa to hello.java z

public class hello {

i w tym hello.java masz

 public static void main(String[] args) {

Następnie (po kompilacji) changeDir (cd) do katalogu, w którym znajduje się twoja hello.class. Następnie

java -cp . mypackage.hello

Pamiętaj o bieżącym katalogu i nazwie pakietu przed nazwą klasy. Działa na moim na Linux Mint i mam nadzieję, że na innych systemach operacyjnych również

Dzięki przepełnieniu stosu za bogactwo informacji.


1
Uwaga: plik klasy powinien być możliwy do znalezienia poprzez ./mypackage/hello.classnazwę. Zobacz też: Pytanie " Uruchamianie javy w pakiecie z linii poleceń ".
ruvim

2

Moja sytuacja była trochę skomplikowana. Musiałem wykonać trzy kroki, ponieważ korzystałem z pliku .dll w katalogu zasobów dla kodu JNI. Moje pliki były

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

Mój kod zawiera następujący wiersz

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

Najpierw musiałem przejść do katalogu classpath

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

Następnie musiałem zmienić ścieżkę klasy, aby wskazywała na bieżący katalog, aby moja klasa została załadowana, i musiałem zmienić ścieżkę klasy, aby wskazywała na katalog zasobów, aby moja dll została załadowana.

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

Następnie musiałem uruchomić java, używając nazwy klasy.

java com.accessibility.HelloWorld 

0

Po pierwsze, czy skompilowałeś klasę za pomocą kompilatora javac z wiersza poleceń? Po drugie, wydaje się, że twoja główna metoda ma nieprawidłowy podpis - powinna pobierać tablicę obiektów String, a nie tylko jeden:

public static void main(String[] args){

Po zmianie kodu tak, aby przyjmował tablicę obiektów typu String, musisz się upewnić, że drukujesz element tablicy, a nie samą tablicę:

System.out.println(args[0])

Jeśli chcesz wydrukować całą listę argumentów wiersza poleceń, musisz użyć pętli, np

for(int i = 0; i < args.length; i++){
    System.out.print(args[i]);
}
System.out.println();
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.