2011-01-26 3 views
4

Les énoncés suivants semblent fonctionner fâcheusement:La classe réside dans un répertoire différent de celui spécifié par le paquet - comment ça se fait?

[email protected]:~/tmp> cat org/foo/Bar.java 
public class Bar { 

} 

[email protected]:~/tmp> javac org/foo/Bar.java 
[email protected]:~/tmp> javap org.foo.Bar 
Compiled from "Bar.java" 
public class org.something.Bar extends java.lang.Object{ 
    public org.something.Bar(); 
} 

Bien que le fichier de classe de bar est dans le répertoire org/foo et déclare le paquet org.something, le compilateur ne se plaint pas. J'étais sous l'impression que java a mandaté une hiérarchie de répertoire qui suit le nom du paquet. Est-ce que je me suis trompé? Si oui, quelles sont les conséquences du mélange des noms de paquets?

Répondre

2

C'est purement conventionnel. Le compilateur utilisera les noms de paquetages. Cela dit, ce n'est généralement pas une bonne idée de rompre avec cette convention. Cela causera des incohérences (les classes générées seront dans les répertoires suivant le paquet) et une certaine confusion!

3

La structure du répertoire source n'est pas nécessaire de suivre nommage des paquets (même si presque toujours fait par convention.)

Je pense Soleil/Oracle javac, javap, java, etc. Les outils (et toutes les autres implémentations Java que je connais) sont ce qui impose la sous-répertoire par règle de composant de nom de paquet (avec les chargeurs de classe par défaut). Je ne pouvais pas trouver quelque chose d'autorité, mais il ne semble pas être une exigence de la spécification de langage Java:

+0

Bonne réponse, merci pour la recherche aussi bien. Il semble qu'aucune implémentation ne l'exige cependant - mon exemple est fait avec les 'javac' et' javap' d'Oracle. –

+0

Par "requires", je voulais dire que ces outils sont ce qui génère l'organisation des paquets et l'exigent à _runtime_. (Les programmes javac/javap ne l'exigent pas des fichiers source.) Le point clé étant les spécifications de langage (et de JVM) ne nécessitent pas d'organisation de sous-répertoire, mais toutes les implémentations d'outils Java standard. – kaliatech

+0

Ils en ont également besoin au moment de la compilation pour compiler les classes dépendantes. Si vous avez compilé une autre classe qui dépendait de Bar et Bar n'a pas été compilée, la compilation échouerait si Bar.java n'était pas au bon endroit. – EJP

Questions connexes