2010-01-26 6 views
4

J'essaie de comprendre comment organiser les fichiers source et classe travaillant avec des paquets. J'ai trouvé un très utile tutorial. Mais j'ai encore quelques questions. Pour autant que j'ai compris, il est recommandé d'avoir un isomorphisme entre le nom des paquets et le nom des répertoires où sont stockés les éléments d'un paquet. Par exemple si j'ai un paquet nommé aaa.bbb.ccc qui contient la classe ddd c'est une bonne pratique d'avoir un fichier de classe appelé "ddd.class" et situé dans "$ CLASSPATH/aaa/bbb/ccc /". Ai-je bien compris?

Si c'est le cas, le compilateur Java mettra-t-il automatiquement les fichiers * .class dans le bon répertoire?

Je n'ai pas réussi à obtenir ce comportement. J'ai mis la variable $CLASSPATH à "/home/myname/java/classes". J'ai exécuté javac KeyEventDemo.java qui contient package events;. Je m'attendais à ce que javac crée un sous-répertoire events sous /home/myname/java/classes et place le KeyEventDemo.class dans ce sous-répertoire.

Cela ne s'est pas produit. J'ai essayé d'aider javac et j'ai créé le sous-répertoire "events" par moi-même. J'ai encore utilisé javac mais il ne veut pas mettre les fichiers de classe sous "/ home/myname/java/classes/events". Qu'est-ce que je fais mal?

Répondre

6

Vous devez utiliser l'option -d pour indiquer où vous souhaitez que les fichiers .class finissent. Spécifiez simplement le répertoire de base; javac créera tous les répertoires nécessaires pour correspondre au bon package.

Exemple (en fonction de votre question):

javac -d ~/java/classes KeyEventDemo.java 
+3

Et pour clarifier $ CLASSPATH: il dira à la JVM où chercher des classes pendant l'exécution, pour ne pas indiquer à javac où créer cette classe et cette expérience. –

2

Ce n'est pas seulement une bonne pratique mais doit dans la plupart des cas.

considèrent une classe Java nommée:

com.example.Hello 

Si vous stockez sur le système de fichiers, il doit a à

/path/to/my/classes/com/example/Hello.java 

Le compilateur (ou au moins la grande majorité) va créer la fichier de classe à

/path/to/my/classes/com/example/Hello.class 

Personnellement, je ne pas utiliser la variable CLASSPATH pour définir le chemin mais l'option -cp sur Java. Un appel à la « demande » ci-dessus pourrait se faire avec:

java -cp /path/to/my/classes com.example.Hello 
4

Par exemple, si j'ai un paquet nommé « aaa.bbb.ccc » qui contient la classe « ddd » il est une bonne pratique avoir un fichier de classe appelé "ddd.class" et situé dans "$ CLASSPATH/aaa/bbb/ccc /". Ai-je bien compris?

Ce n'est pas « bonne pratique » - c'est comment le Sun JDK attend que les choses soient. Sinon, ça ne marchera pas. Théoriquement, d'autres implémentations Java pourraient fonctionner différemment, mais je n'en connais aucune.

Si c'est le cas, sera compilateur Java mis fichier * .class dans un répertoire corriger automatiquement?

Oui

Qu'est-ce que je fais mal?

Le code source doit aussi suivre déjà cette structure, à savoir KeyEventDemo.java doit résider dans un sous-répertoire nommé « événements ». Ensuite, vous faites "javac events/KeyEventDemo.java", et cela devrait fonctionner.

+0

Si vous utilisez l'option '-d' (fortement recommandée, donc les binaires vivent à un endroit différent de la source), alors en théorie, votre source n'a pas à suivre cette hiérarchie. –

+0

Sur java.sun.com, j'ai découvert qu'il peut être pratique de conserver les fichiers * java et * class dans des répertoires différents. Et j'aimerais utiliser cette approche. – Roman

+0

Comme Chris l'a écrit, vous pouvez utiliser l'option -d pour cela. Mais c'est toujours une très bonne idée de garder les fichiers source dans la même hiérarchie de répertoires, ou cela sera très déroutant. –

Questions connexes