web-dev-qa-db-fra.com

Puis-je exécuter à partir du programme de ligne de commande créé par Eclipse?

En utilisant Eclipse, j'ai créé un programme SWT Hello World. J'ai pu exécuter ce programme à partir d'Eclipse et cela a bien fonctionné.

Dans "/ home/myname/workspace/HelloWorldSWT", j'ai trouvé deux fichiers: HelloWorldSWT.Java et HelloWorldSWT.class. Je voulais exécuter le programme correspondant à partir de la ligne de commande. J'ai d'abord essayé de taper "Java HelloWorld" et j'ai reçu le message d'erreur suivant:

Exception in thread "main" Java.lang.NoClassDefFoundError: HelloWorld
   at gnu.Java.lang.MainThread.run(libgcj.so.90)
Caused by: Java.lang.ClassNotFoundException: HelloWorld not found in gnu.gcj.runtime.SystemClassLoader{urls=[file:./], parent=gnu.gcj.runtime.ExtensionClassLoader{urls=[], parent=null}}
   at Java.net.URLClassLoader.findClass(libgcj.so.90)
   at gnu.gcj.runtime.SystemClassLoader.findClass(libgcj.so.90)
   at Java.lang.ClassLoader.loadClass(libgcj.so.90)
   at Java.lang.ClassLoader.loadClass(libgcj.so.90)
   at gnu.Java.lang.MainThread.run(libgcj.so.90)

J'ai également essayé ce "Java -cp/home/roman/workspace/HelloWorld.HelloWorld". En conséquence, j'ai reçu le message d'erreur suivant:

Exception in thread "main" Java.lang.NoClassDefFoundError: loaded class HelloWorld.HelloWorld was in fact named HelloWorld
   at Java.lang.VMClassLoader.defineClass(libgcj.so.90)
   at Java.lang.ClassLoader.defineClass(libgcj.so.90)
   at Java.security.SecureClassLoader.defineClass(libgcj.so.90)
   at Java.net.URLClassLoader.findClass(libgcj.so.90)
   at gnu.gcj.runtime.SystemClassLoader.findClass(libgcj.so.90)
   at Java.lang.ClassLoader.loadClass(libgcj.so.90)
   at Java.lang.ClassLoader.loadClass(libgcj.so.90)
   at gnu.Java.lang.MainThread.run(libgcj.so.90)

Quelqu'un sait-il ce que je fais mal? Merci d'avance pour toute aide.

28
Roman

Allez dans la perspective Debug et sélectionnez le programme que vous venez d'exécuter (où il est dit Terminé, valeur de sortie ... dans l'onglet Debug) Faites un clic droit et choisissez Propriétés, là vous pouvez voir la commande entière commande de ligne lancée par Eclipse.

Vous pouvez exécuter cette même commande dans le même répertoire qu'Eclipse (voir dans Exécuter les configurations, arguments, répertoire de travail) et cela fonctionnera.

69
Persimmonium

Vous devez ajouter le répertoire dans lequel Eclipse stocke le fichier HelloWorldSWT.class dans le chemin de classe. Il est défini lors de la création du projet, comme "bin", "build" ou "classes". Vérifiez les propriétés du projet ou recherchez le fichier HelloWorldSWT.class.

En supposant qu'il s'agit du répertoire build à l'intérieur de l'espace de travail HelloWorldSWT et que votre classe ne se trouve dans aucun package (package par défaut), la commande doit être:

Java -cp /home/roman/workspace/HelloWorldSWT/build HelloWorldSWT

ou passez simplement à ce répertoire et utilisez:

Java -cp . HelloWorldSWT

MODIFIER:
Le -cp . signifie que seul le répertoire réel est utilisé pour rechercher les fichiers de classe. Vous devez également ajouter toutes les bibliothèques (JAR ou autres répertoires) utilisées par votre programme (base de données, SWT, ...).
Pour plus de détails, vous pouvez consulter la documentation: Comment les classes sont trouvées , Définition du chemin de classe et Java comand

7
Carlos Heuberger

Je fais quelques contournements afin de profiter pleinement de la commodité d'Eclipse. Voici ce que j'ai trouvé et cela a bien fonctionné pour moi. J'espère que cela vous aidera: enter image description here

4
foxwendy

Il me semble que vous n'avez pas de classe nommée HelloWorldSWT '', mais plutôt une classe nommée HelloWorldSWT dans un package nommé HelloWorldSWT (vous pouvez le confirmer en allant à la première ligne de HellowWorldSWT.Java, où vous trouverez package HelloWorldSWT;

Si oui, allez dans le répertoire parent et tapez

Java HelloWorldSWT.HelloWorldSWT Cela fonctionnerait.

3
Riduidel

Il est possible que vous ne chargiez pas la bibliothèque SWT correctement et que votre classe ne se charge pas.

La bibliothèque SWT fait partie de fichiers JAR qui sont déjà chargés lorsque vous exécutez Eclipse mais qui ne sont pas chargés dans un paramètre de ligne de commande. Avez-vous modifié votre chemin de classe en conséquence?

Voici un ancien article sur la façon de faire ce genre de choses dans les anciennes versions d'Eclipse http://www.ibm.com/developerworks/opensource/library/os-ecgui1/ Vous aurez besoin de différents pots aujourd'hui avec la dernière version d'Eclipse. Cela pourrait même se résumer à un seul pot.

Consultez la FAQ SWT ; au moins pour Mac Carbon, vous pouvez utiliser un seul pot, je parierais que vous pouvez le faire pour d'autres plates-formes.

De plus, je ne suis pas sûr à 100% que vous pouvez exécuter Eclipse sous openJDK, ce qui semble être le cas sur votre plate-forme.

2
Uri

J'ai trouvé une autre solution rapide et sale si vous voulez juste voir une sortie sur la ligne de commande. Mais c'est pas une bonne pratique pour le long terme!

  1. Supprimez la déclaration de package dans votre code (Eclipse se plaindra et vous donnera une croix rouge, ignorez-la d'abord), par exemple package hello;

  2. Sauvegarder.

  3. Ouvrez votre ligne de commande et naviguez jusqu'à ce que vous soyez dans le dossier src (utilisez cd).

  4. Compilez le fichier Java, par exemple javac HelloWorld.Java

  5. Exécutez le fichier de classe Java, par exemple Java HelloWorld

Cela devrait fonctionner, tant que vous êtes dans le bon répertoire sans aucune déclaration de package dans le code! Les déclarations de package provoquent des problèmes ... et Eclipse est configuré pour s'assurer que tout fonctionne, c'est pourquoi il est correct d'avoir les déclarations de package là-bas. Une solution alternative consiste à vraiment aller définir le chemin de classe par vous-même (ce qui me déroute toujours chaque fois que je dois le faire, ce que je fais rarement).

1
Kevin Lee

Si vous souhaitez exécuter le programme avec des arguments de ligne de commande depuis Eclipse, vous pouvez aller dans Exécuter-> Exécuter les configurations, qui affichera une fenêtre avec le programme que vous exécutez ainsi qu'une boîte dans laquelle vous pourrez saisir des arguments.

1
Ian

Vous n'avez donc pas défini correctement le chemin de classe.

Je pense qu'il est généralement plus pratique d'avoir le IDE construire un fichier jar avec toutes les bibliothèques non-jre incluses et l'exécuter à partir de la ligne de commande.

Java -jar myprogram.jar

Quelle est l'utilité du programme écrit dans Eclipse s'il ne peut être facilement exécuté que dans Eclipse?

C'est vraiment une bonne question, et le déploiement d'applications Java est vraiment un art en soi. La compilation et l'exécution sont - sinon compliquées - au moins lourdes lorsqu'elles sont effectuées à la main. Mais Eclipse et d'autres outils comme Netbeans peut vous aider à effectuer ces tâches de manière simple, et même empaqueter votre programme pour vous afin que ceux qui n'utilisent pas ces outils puissent également exécuter les programmes facilement.

1
deleted

C'est le problème qui est dû au fait que la JVM n'est pas en mesure de trouver la classe HelloWorld car vous avez le nom de classe comme HelloWorldSWT avec la méthode principale. essayer avec

Java HelloWorldSWT

1
GuruKulki