C’est une unité de compilation et de déploiement de code.
Les modules Java permettent de définir explicitement :
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 :
requires
exports
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):
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).
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().
public void afficherMessage()
modules-exemple
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.
module-info.java
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.
-d out
.class
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().
--module-path
--module module2/module2
Le message Message du module 1 ! devrait s’afficher dans le terminal ou la console.
Les modules sont pratiques pour des grosses applications à sécuriser et sur lesquelles travaillent de nombreux développeurs et développeuses !