J’ai deux problèmes en ce qui concerne la compilation et l’exécution d’un projet java Eclipse à partir de la ligne de commande. Cela fonctionne bien lorsque je cours juste à partir de l’IDE Eclipse. J’ai essayé de googler mais je ne pouvais pas vraiment faire fonctionner la chose. Toute aide est très appréciée.
Problème 1: Lorsque j’essaie de comstackr à partir d’un emplacement différent du répertoire où se trouve le fichier .java, le message d’erreur ” ne peut pas lire: myfile.java “. Mais si je migre vers ce répertoire, il se comstack.
La commande que je donnais est (quand dans un autre répertoire):
javac -cp C: \ ABC \ src \ XYZ monfichier.java
La commande que je donnais dans le répertoire XYZ:
javac monfichier.java
Cela a généré deux fichiers .class, myfile.class et Testing_Thread.class (je suppose que c’est parce que j’ai un thread dans mon code)
Problème 2: Après avoir compilé en allant dans son répertoire, lorsque j’essaie d’exécuter le programme, l’erreur ” Exception in thread” “java.lang.NoClassDefFoundError: myfile (nom incorrect: XYZ / myfile.java) ” même lorsque j’essaie de courir à partir du répertoire XYZ. Je reçois la même erreur lorsque j’essaie de courir d’un autre endroit également.
La commande que je donnais dans le répertoire XYZ:
java myfile
La commande que je donnais à un autre endroit:
java -cp C: \ ABC \ src \ XYZ myfile
J’attache également une hiérarchie de ma structure de répertoire si elle est d’une aide quelconque:
Ces exemples supposent la structure source suivante:
C:\temp\comstack-test\src\a\b\c\D.java
Où D.java est:
package abc; public class D { }
Le premier problème, impossible à lire: myfile.java , est dû au fait qu’il n’est pas correct d’utiliser l’option de ligne de commande cp
pour pointer vers votre code source.
C:\temp\comstack-test\src>javac -cp c:\temp\comstack-test\src\a\b\c D.java javac: file not found: D.java Usage: javac use -help for a list of possible options
Cela devrait plutôt être le suivant, où javac
est exécuté à partir de votre dossier source et où nous pouvons utiliser des chemins d’access relatifs aux fichiers source (NOTE – javac
est exécuté à partir du dossier source ici):
C:\temp\comstack-test\src>javac a\b\c\D.java
Ou cela, où nous spécifions des chemins complets vers les fichiers source, et que javac
peut être exécuté de n’importe où (NOTE – javac
est exécuté à partir de C:\
ici):
C:\>javac temp\comstack-test\src\a\b\c\D.java
Les deux options ci-dessus entraîneront la création de vos fichiers de classe dans le même dossier que la source. C’est à dire:
C:\temp\comstack-test\src\a\b\c\D.class
Pour le deuxième problème, si vous essayez d’exécuter une classe dont le nom de paquet provient de ‘à l’intérieur’ du paquet, le nom sera incorrect (NOTE – java
étant exécuté à partir de ‘l’intérieur’ du paquet ici):
C:\temp\comstack-test\src\a\b\c>java D Exception in thread "main" java.lang.NoClassDefFoundError: D (wrong name: a/b/c/D) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631) at java.lang.ClassLoader.defineClass(ClassLoader.java:615) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) at java.net.URLClassLoader.defineClass(URLClassLoader.java:283) at java.net.URLClassLoader.access$000(URLClassLoader.java:58) at java.net.URLClassLoader$1.run(URLClassLoader.java:197) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:247) Could not find the main class: D. Program will exit.
Pour exécuter la classe D
, vous devez être à la racine du paquet et fournir le nom de classe entièrement qualifié . C’est à dire:
C:\temp\comstack-test\src>java abcD Exception in thread "main" java.lang.NoSuchMethodError: main
Notez que je reçois une exception car la classe D
n’a pas de méthode principale et ne peut donc pas être exécutée. Pour résoudre ce problème, nous ajoutons une méthode principale:
package abc; public class D { public static void main(Ssortingng[] args) { System.out.println("main"); } }
et relancez:
C:\temp\comstack-test\src>java abcD main