Utilisation de paquetages Java par la ligne de commande

Les paquetages standards de Java sont accessibles automatiquement par les commandes javac et java (à condition bien sûr de mettre dans son programme les directives import ...; qui conviennent). On va s'intéresser ici au cas de paquetages définis à partir des fichiers sources .java ou de paquetages qui sont fournis sous forme de fichiers .jar.

Paquetage avec des fichiers sources

Quand on dispose des fichiers sources, la structure en paquetages se traduit par des sous-dossiers dans le système de fichier. Supposons que l'on ait un programme qui se compose d'un fichier A.java pour une classe dans le paquetage par défaut, d'un fichier B.java pour une classe dans le paquetage un et d'un fichier C.java pour une classe dans le sous-paquetage un.deux.

A.java :
import un.B;
import un.deux.C;
public class A {
  public static void main(String[] args) { B.f(); }
}
B.java :
package un;
import un.deux.C;
public class B {
  public static void f() { C.f(); }
}
C.java :
package un.deux;
import un.B;
public class C {
  public static void f() { System.out.println("glop"); }
  public static void main(String[] args) { B.f(); }
}

Cela correspond à la structure suivante dans le système de fichiers :

|-- A.java
`-- un
    |-- B.java
    `-- deux
        `-- C.java

La racine est le répertoire dans lequel on place les fichiers du paquetage par défaut. On doit rester dans ce répertoire racine pour lancer les commandes de compilation et d'exécution. Par exemple, javac A.java, noter que javac détecte les dépendances et compile tout ce qui est nécessaire :

racine
|-- A.class
|-- A.java
`-- un
    |-- B.class
    |-- B.java
    `-- deux
        |-- C.class
        `-- C.java

Si on veut ne compiler que C.java, on reste dans racine et on fait javac un/deux/C.java. Si on voulait exécuter C, on ferait java un/deux/C ou java un.deux.C toujours depuis racine.

Remarque
Cette organisation est compatible avec l'usage d'eclipse, si on a choisi le mode qui range les .class avec les .java, et racine est alors le répertoire du projet.

Faire un .jar avec un paquetage

Dans le répertoire racine, on entre la commande jar cf un.jar un/B.class un/deux/C.class où, après jar cf, on met le nom du fichier à construire, ici un.jar, puis tous les fichiers .class voulus (on peut utiliser l'*).

On peut maintenant effacer ou déplacer le répertoire un.

Utiliser un paquetage contenu dans un .jar

On suppose ici que l'on n'a que les fichiers A.java et un.jar construits comme ci-dessus.
On peut compiler par javac -cp "un.jar:." A.java et exécuter par java -cp "un.jar:." A où, dans ces deux commandes, l'option -cp "un.jar:." indique le classpath qui dit où chercher ce dont on a besoin pour compiler ou exécuter. Ici, on regarde dans un.jar et dans ., ie le répertoire courant.

Remarque
On peut aussi faire java -cp "un.jar" un.deux.C pour exécuter C.