2017-10-18 22 views
1

Je me demandais pourquoi les étapes suivantes fonctionnent.Pourquoi javac accepte de compiler des classes avec une déclaration de paquet avec une structure arborescente incorrecte

Disons que la structure du fichier est:

- src 
    - Toto.java 

le fichier Toto.java contient

package myPackage; 
class Toto{} 

Les official javac specification états

Réorganiser les fichiers source dans une arborescence de répertoires qui reflète leur paquet arbre. Par exemple, si tous vos fichiers source sont dans \ workspace, alors placez le code source de com.mysoft.mypack.MyClass dans/workspace dans \ workspace \ com \ mysoft \ mypack \ MyClass.java.

Je pensais que

$ cd src 
$ javac Toto.java 

une erreur sortie volonté. Au lieu de cela, le compilateur ne génère aucune erreur et compile le fichier approprié.

De toute évidence,

cd src 
javac PokerQ/Affichage.java 

ou

javac PokerQ/Affichage.java 

ne pas compiler.

Répondre

2

En principe, vous n'avez pas besoin de placer vos fichiers source dans une arborescence correspondant à la hiérarchie du package. Le compilateur compilera chaque classe et stockera le nom du paquet en interne. Quelle que soit la manière dont vous organisez les répertoires sources, chaque fichier généré .class saura à quel paquet il correspond.

Le problème potentiel est que, si vous compilez plusieurs classes, certaines de ces classes se référeront probablement l'une à l'autre. Le compilateur et le JRE utilisent la hiérarchie de répertoires comme un moyen de trouver des classes, lorsqu'une classe en référence une autre. Par défaut, le compilateur placera un fichier .class compilé dans le même répertoire que sa source Java. Si le répertoire source est higgledy-piggledy, vous obtenez un ensemble de fichiers .class qui ne sont pas eux-mêmes structurés en fonction des paquets, ce qui rend difficile leur recherche. Vous pourriez toujours être en mesure de contourner le problème - si vous le souhaitez vraiment - en définissant avec soin le chemin de recherche de classe dans vos lignes de commande javac ou java.

De plus, si vous spécifiez un répertoire au compilateur en utilisant -d <path>, alors il construira une arborescence de classes compilées qui correspond à la hiérarchie du paquet, même si les sources sont faussées. Je ne suis pas sûr que quiconque utilise l'approche par défaut, que les classes compilées soient placées dans les mêmes répertoires que les sources et, en principe, vous pourriez probablement construire une application Java multi-paquet assez complexe où tous les fichiers sources même répertoire - en supposant que vous puissiez garder une trace de tous. Quoi qu'il en soit, l'idée que l'arbre source corresponde à la hiérarchie des paquets est fermement ancrée dans la méthodologie de développement de Java, qu'elle soit toujours strictement nécessaire ou non.Les outils IDE et les outils de construction comme Ant et Maven assument tous cette organisation, donc vous devriez avoir un peu de sang-froid pour travailler d'une autre façon.