Aller au contenu

Notion de module

C’est quoi ?

C’est une unité de compilation et de déploiement de code.

Les modules Java permettent de définir explicitement :

Mais où sont-ils ?

Les modules sont définis dans un fichier module-info.java qui est inclus dans chaque module.

Exemple :

module fr.pbouget.app {
    requires fr.pbouget.library;
    exports fr.pbouget.app.api;
}

Dans ce morceau de code, le module fr.pbouget.app déclare :

A quoi ça sert ?

Introduits depuis java version 9, les modules permettent de structurer et de gérer les applications Java de manière modulaire. On avait deviné !

Avantages (pour applications de très grande envergure):

Comment la taille de l’application est-elle réduite ?

En définissant les modules dont votre application a réellement besoin et en spécifiant uniquement les services et les ressources qui doivent être exposés. La taille est alors minimisée (nombre de classes et de bibliothèques incluses dans le runtime).

Exemple simple

Pour cet exemple, nous allons créer un projet qui se compose de 2 modules :

Le module1 contient une classe Module1 qui affiche tout simplement un message tandis que le module2 contient une classe Module2 qui appelle la méthode public void afficherMessage().

  1. Créez un dossier modules-exemple et à l’intérieur créez deux sous-dossiers module1 et module2 (des packages).
  2. Dans le package module1, créez une classe Module1 :
package module1;

public class Module1 {
    public void afficherMessage() {
        System.out.println("Message du module 1 !");
    }
}

Dans le package module2, créez une nouvelle classe Module2 :

package module2;
import module1.Module1; // ici on importe la classe Module1 du package module1

public class Module2 {
    public static void main(String[] args) {
        Module1 module1 = new Module1();
        module1.afficherMessage();
    }
}

Dans chaque dossier, créez un fichier module-info.java qui spécifie les informations pour chaque module.

Dans le fichier module-info.java du module1 :

module module1 {
    exports module1;
}

Dans le fichier module-info.java du module2 :

module module2 {
    requires module1;   // dépendence
    exports module2;    // rend les classes du package accessibles aux autres modules
}

Si vous n’utilisez pas un IDE, voici ce que vous devez écrire en ligne de commande :

javac -d out --module-path modules-exemple/module1;modules-exemple/module2 modules-exemple/module1/module-info.java modules-exemple/module1/Module1.java modules-exemple/module2/module-info.java modules-exemple/module2/Module2.java

Le drapeau (flag) -d out précise que les fichiers .class générés seront placés dans le dossier out.

java --module-path modules-exemple/module1;modules-exemple/module2 --module module2/module2

Le drapeau --module-path précises le chemin vers les fichiers de module et --module module2/module2 précise le module et la classe à exécuter, celui qui contient la méthode main().

Le message Message du module 1 ! devrait s’afficher dans le terminal ou la console.

Conclusion

Les modules sont pratiques pour des grosses applications à sécuriser et sur lesquelles travaillent de nombreux développeurs et développeuses !