Come eseguire un .class java dalla riga di comando


113

Ho una classe java compilata:

Echo.class

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

            System.out.println(arg);
    }
}

I cdalla directory e inserisci:java Echo "hello"

Ottengo questo errore:

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.

Qual è il modo più semplice per ottenere il mio codice Java in una forma che posso eseguire dalla riga di comando anziché dover utilizzare Eclipse IDE?


14
Suggerimento: la domanda originale sarebbe, forse, meglio lasciare inedita per non invalidare le risposte, sotto una rapida revisione. Davvero strano vedere la giusta firma del metodo e poi un mucchio di risposte che dicono che non era corretto. Si suppone che questo codice sia errato, almeno ai fini del confronto con la versione corretta.
JSmyth

Risposte:


119

Provare:

java -cp . Echo "hello"

Supponendo che tu abbia compilato con:

javac Echo.java 

Quindi c'è la possibilità che la directory "corrente" non sia nel tuo classpath (dove java cerca le definizioni .class)

In questo caso, viene visualizzato l'elenco dei contenuti della directory:

Echo.java
Echo.class

Quindi tutto ciò potrebbe funzionare:

java -cp . Echo "hello"

o

SET CLASSPATH=%CLASSPATH;.  

java Echo "hello"

E più tardi, come fa notare Fredrik , riceverai un altro messaggio di errore come.

Eccezione nel thread "main" java.lang.NoSuchMethodError: main

Quando ciò accade, vai a leggere la sua risposta :)


2
Il -cp. per dire a Java che dovrebbe aggiungere. (directory di lavoro corrente) al classpath, ovvero il luogo in cui sta cercando il codice.
Fredrik

16

Devi specificare il classpath. Questo dovrebbe farlo:

java -cp . Echo "hello"

Questo dice a java di usare .(la directory corrente) come suo classpath, cioè il posto dove cerca le classi. Nota che quando usi i pacchetti, il classpath deve contenere la directory root, non le sottodirectory dei pacchetti. ad esempio, se la tua classe è my.package.Echoe il file .class è bin/my/package/Echo.class, la directory del percorso di classe corretta è bin.


15

Non hai un metodo principale valido ... La firma dovrebbe essere: public static void main ( String [] args);

Quindi, nel tuo caso il codice dovrebbe assomigliare a questo:

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

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

Modifica: tieni presente che Oscar ha ragione anche in quanto ti manca. nel tuo classpath, ti imbatteresti nel problema che risolvo dopo aver affrontato quell'errore.


15

Con Java 11 non dovrai più passare attraverso questa trafila!

Invece, puoi fare questo:

> java MyApp.java

Non è necessario compilare in anticipo, poiché tutto viene eseguito in un unico passaggio.

È possibile ottenere Java 11 JDK qui: JDK 11 GA Release


> copia C: \ Desenv \ workspaceServer \ TestProject \ src \ WebServiceStandAlone \ MyApp.java. / y && javac MyApp.java && java -cp. MyApp && del MyApp.class && del MyApp.java Alcuni ragazzi preferiscono la vecchia maniera =)
Jr.

3

Se hai nel tuo codice sorgente java

package mypackage;

e la tua classe è hello.java con

public class hello {

e in quel ciao.java hai

 public static void main(String[] args) {

Quindi (dopo la compilazione) cambiaDir (cd) nella directory in cui si trova la tua hello.class. Poi

java -cp . mypackage.hello

Ricorda la directory corrente e il nome del pacchetto prima del nome della classe. Funziona per la mia menta su Linux e spero anche sugli altri sistemi operativi

Grazie Stack overflow per una grande quantità di informazioni.


1
NB: il file di classe dovrebbe essere reperibile tramite ./mypackage/hello.classnome. Vedi anche: Domanda " Esecuzione di java nel pacchetto dalla riga di comando ".
ruvim

2

La mia situazione era un po 'complicata. Ho dovuto fare tre passaggi poiché stavo usando un .dll nella directory delle risorse, per il codice JNI. I miei file erano

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

Il mio codice conteneva la seguente riga

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

Per prima cosa, ho dovuto spostarmi nella directory classpath

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

Successivamente, ho dovuto modificare il classpath in modo che punti alla directory corrente in modo che la mia classe venisse caricata e ho dovuto modificare il classpath in modo che punti alla directory delle risorse in modo che la mia dll venisse caricata.

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

Quindi, ho dovuto eseguire java usando il classname.

java com.accessibility.HelloWorld 

0

Innanzitutto, hai compilato la classe utilizzando il compilatore javac della riga di comando? In secondo luogo, sembra che il tuo metodo principale abbia una firma errata: dovrebbe contenere un array di oggetti String, piuttosto che uno solo:

public static void main(String[] args){

Dopo aver modificato il codice per accettare un array di oggetti String, devi assicurarti di stampare un elemento dell'array, piuttosto che l'array stesso:

System.out.println(args[0])

Se vuoi stampare l'intero elenco degli argomenti della riga di comando, devi usare un ciclo, ad es

for(int i = 0; i < args.length; i++){
    System.out.print(args[i]);
}
System.out.println();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.