Comment exécuter un java .class à partir de la ligne de commande

113

J'ai une classe java compilée:

Classe d'écho

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

            System.out.println(arg);
    }
}

I cddans le répertoire et entrez:java Echo "hello"

J'obtiens cette erreur:

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.

Quel est le moyen le plus simple d'obtenir mon code java sous une forme que je peux exécuter à partir de la ligne de commande car il faut utiliser Eclipse IDE?

Joe
la source
14
Suggestion: La question initiale serait peut-être préférable de ne pas être modifiée afin de ne pas invalider les réponses, après un examen rapide. Vraiment bizarre de voir la bonne signature de méthode, puis un tas de réponses qui disent que c'était incorrect. Un code erroné est censé être laissé, au moins à des fins de comparaison avec la version correcte.
JSmyth

Réponses:

119

Essayer:

java -cp . Echo "hello"

En supposant que vous avez compilé avec:

javac Echo.java 

Ensuite, il y a une chance que le répertoire "courant" ne soit pas dans votre chemin de classe (où java recherche les définitions .class)

Si tel est le cas, la liste du contenu de votre répertoire s'affiche:

Echo.java
Echo.class

Ensuite, tout cela peut fonctionner:

java -cp . Echo "hello"

ou

SET CLASSPATH=%CLASSPATH;.  

java Echo "hello"

Et plus tard, comme le souligne Fredrik , vous recevrez un autre message d'erreur comme.

Exception dans le thread "main" java.lang.NoSuchMethodError: main

Lorsque cela se produit, allez lire sa réponse :)

OscarRyz
la source
2
Le -cp. pour dire à Java qu'il devrait ajouter. (répertoire de travail actuel) au classpath, c'est-à-dire l'endroit où il cherche du code.
Fredrik
16

Vous devez spécifier le chemin de classe. Cela devrait le faire:

java -cp . Echo "hello"

Cela indique à java d'utiliser .(le répertoire courant) comme chemin de classe, c'est-à-dire l'endroit où il cherche les classes. Notez que lorsque vous utilisez des packages, le chemin de classe doit contenir le répertoire racine, pas les sous-répertoires du package. par exemple, si votre classe est my.package.Echoet le fichier .class est bin/my/package/Echo.class, le répertoire de chemin de classe correct est bin.

Michael Borgwardt
la source
15

Vous n'avez pas de méthode principale valide ... La signature doit être: public static void main ( String [] args);

Par conséquent, dans votre cas, le code devrait ressembler à ceci:

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

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

Edit: Veuillez noter qu'Oscar a également raison en ce que vous manquez. dans votre chemin de classe, vous rencontreriez le problème que je résous après avoir traité cette erreur.

Fredrik
la source
15

Avec Java 11, vous n'aurez plus à passer par cette rigmarole!

Au lieu de cela, vous pouvez faire ceci:

> java MyApp.java

Vous n'êtes pas obligé de compiler au préalable, car tout est fait en une seule étape.

Vous pouvez obtenir le JDK Java 11 ici: JDK 11 GA Release

Ryan Lundy
la source
> copiez C: \ Desenv \ workspaceServer \ TestProject \ src \ WebServiceStandAlone \ MyApp.java. / y && javac MyApp.java && java -cp. MyApp && del MyApp.class && del MyApp.java Certains gars préfèrent l'ancienne mode =)
Jr.
3

Si vous avez dans votre source java

package mypackage;

et votre classe est hello.java avec

public class hello {

et dans ce hello.java vous avez

 public static void main(String[] args) {

Puis (après compilation) changezDir (cd) dans le répertoire où se trouve votre hello.class. ensuite

java -cp . mypackage.hello

Faites attention au répertoire actuel et au nom du package avant le nom de la classe. Cela fonctionne pour mon sur Linux mint et j'espère que sur les autres os également

Merci Stack overflow pour une mine d'informations.

Gérard Doets
la source
1
NB: le fichier de classe doit pouvoir être trouvé via ./mypackage/hello.classnom. Voir aussi: question " Exécution de java dans un package à partir de la ligne de commande ".
ruvim
2

Ma situation était un peu compliquée. J'ai dû faire trois étapes puisque j'utilisais un .dll dans le répertoire des ressources, pour le code JNI. Mes fichiers étaient

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

Mon code contenait la ligne suivante

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

Tout d'abord, j'ai dû passer au répertoire classpath

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

Ensuite, j'ai dû changer le chemin de classe pour qu'il pointe vers le répertoire courant afin que ma classe soit chargée et j'ai dû changer le chemin de classe pour qu'il pointe vers le répertoire des ressources afin que ma dll soit chargée.

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

Ensuite, j'ai dû exécuter java en utilisant le nom de la classe.

java com.accessibility.HelloWorld 
Scott Izu
la source
0

Tout d'abord, avez-vous compilé la classe à l'aide du compilateur javac en ligne de commande? Deuxièmement, il semble que votre méthode principale ait une signature incorrecte - elle devrait prendre un tableau d'objets String, plutôt qu'un seul:

public static void main(String[] args){

Une fois que vous avez modifié votre code pour intégrer un tableau d'objets String, vous devez vous assurer que vous imprimez un élément du tableau, plutôt que le tableau lui-même:

System.out.println(args[0])

Si vous souhaitez imprimer la liste complète des arguments de ligne de commande, vous devez utiliser une boucle, par exemple

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