Comment exécuter des fichiers Java .class?

J’ai compilé un programme HelloWorld et j’utilise l’invite de commande pour l’exécuter. Le fichier .class est nommé HelloWorld2.class

Le fichier se trouve dans C: \ Utilisateurs \ Matt \ workspace \ HelloWorld2 \ bin Voici ce que j’obtiens lorsque je vais à l’invite de commande et que vous tapez “Java HelloWorld2”:

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é.

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

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

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

 java -classpath /path/to/jars . 

où nomPack (commence généralement par com ou org ) est le nom du dossier où votre fichier de classe est présent.

Par exemple, si le nom de votre classe principale est App et que le nom du package Java de votre application est com.foo.app , votre fichier de classe doit figurer dans le dossier com/foo/app (dossier distinct pour chaque point). comme:

 $ 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 de package défini, lancez simplement comme java App .

Si vous avez d’autres dépendances jar, assurez-vous d’avoir spécifié votre paramètre classpath avec -classpath / -classpath ou avec la variable CLASSPATH qui pointe vers le dossier avec vos fichiers jar / war / ear / zip / class . Donc, sous Linux, vous pouvez préfixer la commande avec: CLASSPATH=/path/to/jars , sous Windows, vous devez append le dossier dans la variable système. S’il n’est pas défini, le chemin de la classe d’utilisateurs comprend le répertoire en cours ( . ).


Exemple pratique

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

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

et nous avons compilé notre projet par mvn comstack dans notre mvn comstack my-app/ , cela générera notre fichier de classe dans target/classes/com/foo/app/App.class .

Pour l’exécuter, nous pouvons soit spécifier le chemin de classe via -cp ou y accéder directement, voir 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 package, vous pouvez utiliser l’outil de désassemblage de fichiers de classe Java, par exemple:

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

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

Cela peut signifier beaucoup de choses, mais la plus courante est que la classe contenue dans le fichier n’a pas le même nom que le fichier lui-même. Vérifiez donc si votre classe s’appelle également HelloWorld2.