web-dev-qa-db-fra.com

Comment exécuter des fichiers Java .class?

J'ai compilé un programme HelloWorld et j'utilise la commande Invite pour l'exécuter. Le fichier .class est nommé HelloWorld2.class

Le fichier se trouve dans C:\Utilisateurs\Matt\espace de travail\HelloWorld2\bin.

C:\Users\Matt>Java HelloWorld2
Exception in thread "main" Java.lang.NoClassDefFoundError: HelloWorld2
Caused by: Java.lang.ClassNotFoundException: HelloWorld2
        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)
Could not find the main class: HelloWorld2.  Program will exit.

Je m'attendais à voir un HelloWorld imprimé. Qu'est-ce que je fais mal? J'ai le JDK installé.

61
Skizz

Vous devez définir le chemin de classe pour trouver votre classe compilée:

Java -cp C:\Users\Matt\workspace\HelloWorld2\bin HelloWorld2

81
Isaac Truett

Pour exécuter fichier de classe Java à partir de la ligne de commande, la syntaxe est la suivante:

Java -classpath /path/to/jars <packageName>.<MainClassName>

où packageName (commençant généralement par com ou org) est le nom du dossier dans lequel votre fichier de classe est présent.

Par exemple, si le nom de votre classe principale est App et nom du package Java de votre application est com.foo.app, votre fichier de classe doit être dans com/foo/app dossier (dossier séparé pour chaque point), vous exécutez votre application en tant que:

$ Java com.foo.app.App

Remarque: $ indique l'invite du shell, ignorez-le lors de la saisie.

Si votre classe n'a pas de nom package défini, exécutez-le simplement comme suit: Java App.

Si vous avez d'autres dépendances de jar, assurez-vous que vous avez spécifié votre paramètre classpath avec -cp/-classpath ou en utilisant CLASSPATH variable qui pointe vers le dossier avec votre jar / war / oreille / Zip / class fichiers. Donc, sur Linux, vous pouvez préfixer la commande avec: CLASSPATH=/path/to/jars, sous Windows, vous devez ajouter le dossier dans la variable système. S'il n'est pas défini, le chemin de la classe d'utilisateurs est constitué du répertoire en cours (.).


Exemple pratique

Étant donné que nous avons créé un exemple de projet en utilisant Maven en tant que:

$ mvn archetype:generate -DgroupId=com.foo.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false 

et nous avons compilé notre projet par mvn compile dans notre my-app/ dir, il va générer notre fichier de classe est en target/classes/com/foo/app/App.class.

Pour l'exécuter, nous pouvons soit spécifier le chemin de classe via -cp ou allez directement à l’affichage, consultez les exemples ci-dessous:

$ find . -name "*.class"
./target/classes/com/foo/app/App.class
$ CLASSPATH=target/classes/ Java com.foo.app.App
Hello World!
$ Java -cp target/classes com.foo.app.App
Hello World!
$ Java -classpath .:/path/to/other-jars:target/classes com.foo.app.App
Hello World!
$ cd target/classes && Java com.foo.app.App
Hello World!

Pour vérifier votre nom de classe et de paquet, vous pouvez utiliser Java, par exemple:

$ javap target/classes/com/foo/app/App.class
Compiled from "App.Java"
public class com.foo.app.App {
  public com.foo.app.App();
  public static void main(Java.lang.String[]);
}

Remarque: javap ne fonctionnera pas si le fichier compilé a été obscurci.

32
kenorb

Cela peut signifier beaucoup de choses, mais le plus commun est que la classe contenue dans le fichier n'a pas le même nom que le fichier lui-même. Alors, vérifiez si votre classe s'appelle aussi HelloWorld2.

2
Federico Vera