Les paquetages en Java                        

Les paquetages en Java

           

Généralités

Les paquetages servent à structurer l'ensemble des classes et interfaces écrits en Java. Leur utilité est multiple :

Les noms de paquetage prennent une forme telle que coursJava.monPaquet. Si la classe DansPaquetage se trouve dans un paquetage coursJava.monPaquet, alors son nom complet est coursJava.monPaquet.DansPaquetage. Le fichier DansPaquetage.class sera nécessairement rangé dans un répertoire de nom monPaquet contenu par un répertoire de nom coursJava. Autrement dit, la fin du chemin d'accès à ce fichier sera coursJava/monPaquet.

Mettez-vous à la place de "quelqu'un" (par exemple un compilateur) qui recherche la classe DansPaquetage en sachant qu'elle se trouve dans le paquetage coursJava.monPaquet. Supposez par ailleurs que vous disposiez d'une liste de chemins d'accès à des "répertoires racines" de paquetage (le répertoire coursJava est une telle racine) ; supposez que dans cette liste figure le chemin d'accès au répertoire coursJava. Vous pouvez retrouver la classe DansPaquetage en prenant les uns après les autres les chemins d'accès aux répertoires racines puis en complétant par le chemin relatif coursJava/monPaquet pour voir si vous trouvez la classe DansPaquetage.

De l'intérieur d'un fichier Java, on peut être dispensé de nommer complètement les classes issus d'un autre paquetage grâce à l'instruction import. Imaginons néanmoins que vous utilisiez dans un même fichier Java les classes coursJava.monPaquet. DansPaquetage et coursJava.tonPaquet.DansPaquetage, alors les directives :

import coursJava.monPaquet.DansPaquetage; et
import coursJava.tonPaquet.DansPaquetage;
ne pourraient pas vous servir à faire un raccourci en nommant l'une ou l'autre des classes par DansPaquetage : vous aurez recours aux noms complets.

Signalons que, à l'intérieur d'un même paquetage, on peut utiliser toute classe de ce paquetage sans instruction import.

Une classe dans un paquetage

Considérons la classe suivante, dont le code source se trouve dans le fichier DansPaquetage.java.

package coursJava.monPaquet;

public class DansPaquetage
{
  public void faire() 
  {
    System.out.println("bonjour depuis monPaquet");
  }
}
La première ligne indique que cette classe fait partie d'un paquetage. L'instruction :
package ...;
si elle existe, doit toujours être en première ligne du code.

Le fichier DansPaquetage.java peut se trouver n'importe où. Vous pourrez le compiler. Mais il est nécessaire (si vous voulez utiliser la classe DansPaquetage) que la fin du chemin d'accès au fichier DansPaquetage.class soit coursJava/monPaquet/.

Il faut donc veiller à mettre les fichiers .class dans le bon répertoire.

On supposera dans les explications qui suivent que les fichiers et répertoires suivent la dispoistion ci-dessous, où une flèche sigifie :"contient".

Définir, compiler et exécuter une classe utilisant la classe coursJava.monPaquet.DansPaquetage

Si vous travaillez par exemple avec Eclipse, une partie des difficultés ci dessous sont transparentes.

Considérons la classe suivante qui se trouve dans un répertoire quelconque, et qui ne fait pas partie d'un paquetage.

import coursJava.monPaquet.DansPaquetage;

class UtiliseUneClasse
{
  public static void main(String[] arg)
  {
    (new DansPaquetage()).faire();
  }  
}
Lorsqu'on veut compiler cette classe, le problème pour le compilateur est de trouver la classe coursJava.monPaquet.DansPaquetage.
Il faut lui indiquer le chemin. Une partie de cette indication est donnée par l'instruction import, qui indique sur notre exemple que la classe DansPaquetage se trouve dans le répertoire monPaquet et que ce répertoire se trouve dans le répertoire coursJava. Le complément de l'indication doit être donné par l'option -cp de la commande javac. Vous pouvez indiquer à la suite de -cp les chemins absolus ou relatifs des répertoires à localiser (en les séparant par des ':' sous Unix, ou des ';' sous DOS).
Ici, supposons que la classe UtiliseUneClasse soit dans le répertoire monPaquet et qu'on veuille compiler cette classe de ce même répertoire, la commande pourrait être :
javac -cp ../../ UtiliseUneClasse

Le compilateur cherchera alors à partir du répertoire contenant coursJava dans coursJava/monPaquet, comme indiqué par le nom du paquetage, et trouvera la classe DansPaquetage.

On peut exécuter du répertoire monPaquet en envoyant la commande

java -cp ../../:. UtiliseUneClasse : la classe coursJava.monPaquet.DansPaquetage sera trouvé grâce à ../../ et la classe UtiliseUneClasse grâce à ./ .

Si on exécute du répertoire coursJava, la commande devient :

java -cp ../:monPaquet/ UtiliseUneClasse

Exécuter une méthode main d'une classe qui se trouve dans un paquetage

Considérons la classe ci-dessous dont le bytecode se trouve dans le répertoire autrePaquet.
package autrePaquet;
import coursJava.monPaquet.*;

class PetitEssai
{
  public static void main(String[] arg)
  {
    (new DansPaquetage()).faire();
  } 
}
On compile le fichier contenant cette classe comme indiqué plus haut, par la commande :
javac -cp ../../ PetitEssai.java
si le fichier source est dans le répertoire autrePaquet

Pour exécuter la méthode main de la classe PetitEssai, il faut donner le nom long de la classe, c'est-à-dire ici >autrePaquet.PetitEssai. On peut exécuter cette méthode main du répertoire coursJava par la commande :
java -cp .:../ autrePaquet.PetitEssai
ou bien du répertoire autrePaquet par la commande :
java -cp ../:../../ autrePaquet.PetitEssai

ou de n'importe quel répertoire en utilisant les chemins convenables.

Si on suit les recommandations ci-dessus, on a la bonne surprise de voir
bonjour depuis monPaquet

Si vous voulez récupérer ces quelques programmes :


© Irène Charon, Télécom ParisTech 2011