2010-06-26 7 views
1

Je suis intrigué par le processus d'exécution des programmes Java, peut-être que vous pouvez aider.java class pas trouvé malgré la fourniture d'un fichier jar

J'ai plusieurs fichiers .java dans ~/working_dir/org/project/ qui ont des fonctions principales, et je veux les empaqueter dans un pot pour les exécuter. Je fais:

cd ~/working_dir/org/projectname 
javac -classpath $CLASSPATH *.java 
cd ~/working_dir/ 
jar cf myjar.jar org/ 

Et puis essayez d'exécuter une des classes dans le pot en faisant: java -cp myjar.jar org.project.SomeClass

et obtenir

Exception in thread "main" java.lang.NoClassDefFoundError: org/project/SomeClass 
Could not find the main class: org.project.SomeClass 

Que dois-je faire de mal? Les classes compilent sans aucune erreur, et jar tf myjar.jar montre qu'elles sont bien là. Pour autant que je sache, je n'ai pas besoin de créer un fichier manifeste parce que je fournis la classe à partir de laquelle je veux exécuter la fonction principale à l'exécution - ou est-ce que je me trompe ici?

Aide très appréciée!

+0

Votre fichier org.project.SomeClass.java a un paquet 'org.project;' déclaration au sommet? – nos

+0

Essayez d'afficher la sortie de 'jar tf myjar.jar'. Pour org.project.SomeClass à trouver, une entrée org/project/SomeClass.class doit être présente (avec exactement ce nom) –

+0

oui, il y a une instruction 'package org.project;' et 'jar tf myjar.jar' le montre comme org/project/SomeClass –

Répondre

0

Si l'org pot a explosé/projet/SomeClass est sous votre répertoire de travail courant:

/ <- you are here 
+---/org 
    | 
    +-----/project 
      | 
      +--------SomeClass.class 

essayer java -cp. org.project.SomeClass à la place

0

Tout d'abord, notez que si vous faites simplement

javac org/project/SomeClass.java 

le fichier de classe finira juste à côté du fichier .java qui le rend difficile d'inclure uniquement les fichiers .class- dans le pot. Je vous suggère d'utiliser l'option -d pour spécifier le répertoire de destination:

javac -d bin org/project/SomeClass.java 

Jetez un oeil à la soirée de session suivante pour plus de détails pour le faire fonctionner:

Une liste du répertoire source:

[email protected]:/working_dir/src$ ls -R 
.: 
org 

./org: 
projectname 

./org/projectname: 
SomeClass.java 

Le fichier SomeClass.java:

[email protected]:/working_dir/src$ cat org/projectname/SomeClass.java 
package org.project; 

public class SomeClass { 
    public static void main(String[] args) { 
     System.out.println("Hello World"); 
    } 
} 

Compile (avec répertoire cible ../bin)

[email protected]:/working_dir/src$ javac org/projectname/SomeClass.java -d ../bin 

Liste du résultat et assurez-vous que vous avez les bons répertoires:

[email protected]:/working_dir/src$ cd ../bin/ 
[email protected]:/working_dir/bin$ ls -R 
.: 
org 

./org: 
project 

./org/project: 
SomeClass.class 

Créez le fichier jar:

[email protected]:/working_dir/bin$ jar cf myjar.jar org 

Assurez-vous vous avez les répertoires à droite et n'a pas inclus accidentellement le répertoire "bin":

[email protected]:/working_dir/bin$ jar tf myjar.jar 
META-INF/ 
META-INF/MANIFEST.MF 
org/ 
org/project/ 
org/project/SomeClass.class 

Lancer la principale méthode:

[email protected]:/working_dir/bin$ java -cp myjar.jar org.project.SomeClass 
Hello World 

[email protected]:/working_dir/bin$ 
+0

Merci pour les instructions détaillées. C'est à peu près ce que je pensais faire avant (à l'exception de ne pas avoir un bin/dossier séparé), mais cette fois cela a fonctionné - j'ai dû faire une petite erreur mais cruciale la première fois. –