Projet multi-module avec Maven

Projet multi-module avec Maven

1. Vue d'ensemble

Dans ce didacticiel, nous allons montrer comment créer un projet multi-module avec Maven.

Tout d'abord, nous allons discuter de ce qu'est un projet multi-module et examiner les avantages de suivre cette approche. Ensuite, nous configurerons notre exemple de projet. Pour une bonne introduction à Maven, consultezthis tutorial.

2. Projet multi-modules de Maven

Un projet multi-module est construit à partir d'un POM agrégateur qui gère un groupe de sous-modules. Dans la plupart des cas, l'agrégateur se trouve dans le répertoire racine du projet et doit avoir un package de typepom.

Désormais, les sous-modules sont des projets Maven classiques et peuvent être construits séparément ou par l’intermédiaire du POM de l’agrégateur.

En construisant le projet via l'agrégateur POM, chaque projet dont le type de packaging est différent depom se traduira par un fichier archive généré.

3. Avantages de l'utilisation de multi-modules

L'avantage significatif de l'utilisation de cette approche est quewe may reduce duplication.

Disons que nous avons une application qui se compose de plusieurs modules, que ce soit un module frontal et un module back-end. Maintenant, nous travaillons sur les deux et changeons les fonctionnalités qui affectent les deux. Dans ce cas, sans outil de construction spécialisé, nous devrons créer les deux composants séparément ou écrire un script qui compilerait le code, exécuterait des tests et afficherait les résultats. Ensuite, après avoir reçu encore plus de modules dans le projet, il deviendra plus difficile à gérer et à maintenir.

De plus, dans le monde réel, les projets peuvent avoir besoin de certains plugins Maven pour effectuer diverses opérations pendant lesbuild lifecycle, partager des dépendances et des profils ou inclure d'autresBOM projects.

Par conséquent, lors de l'utilisation de multi-modules, nous pouvonsbuild our application’s modules in a single command et si l'ordre compte, Maven le découvrira pour nous. De plus, nous pouvonsshare a vast amount of configuration with other modules.

4. Parent POM

Maven prend en charge l'héritage de manière à ce queeach pom.xml file has the implicit parent POM, it’s called Super POM et puisse être localisé dans les binaires Maven. Ces deux fichiers sont fusionnés par Maven et forment le POM effectif.

Par conséquent, nous pouvons créer nosown pom.xml file which will serve us as the parent project. Ensuite, nous pouvons y inclure toutes les configurations avec des dépendances et définir ceci comme parent de nos modules enfants, afin qu'ils en héritent.

Outre l'héritage, Maven fournit la notion d'agrégation. Le POM parent qui exploite cette fonctionnalité est appelé un POM.agrégé Fondamentalement, ce type de POMdeclares its modules explicitly in its pom.xml file.

5. Sous-modules

Les sous-modules ou sous-projets sont des projets Maven standard hérités du POM parent. Comme nous le savons déjà, l'héritage nous a permis de partager la configuration et les dépendances avec des sous-modules. Cependant, si nous souhaitons créer ou publier notre projet en une seule fois, nous devons déclarer nos sous-modules explicitement dans le POM parent. En fin de compte, notre POM parent sera à la fois le parent et le POM agrégé.

6. Construire l'application

Maintenant que nous comprenons les sous-modules et la hiérarchie de Maven, créons un exemple d’application pour les démontrer. Nous utiliserons l'interface de ligne de commande de Maven pour générer nos projets.

Cette application sera composée de trois modules, qui représenteront:

  • Le spartcore de notre domaine

  • Un webservice fournissant des API REST

  • Unwebapp ne contenant pas d'actifs Web destinés aux utilisateurs

Étant donné que nous allons nous concentrer sur Maven, la mise en œuvre de ces services restera indéfinie.

6.1. Génération de POM Parent

First, let’s create a parent project:

mvn archetype:generate -DgroupId=org.example -DartifactId=parent-project

Une fois le parent généré, nous devons ouvrir le fichierpom.xml situé dans le répertoire du parent et changer le packaging en pom.

pom

En définissant l'empaquetage sur le type pom, nous déclarons que le projet servira de parent ou d'agrégateur - il ne produira plus d'artefacts.

Maintenant que notre agrégateur est terminé, nous pouvons générer nos sous-modules.

Cependant, il convient de noter que c’est l’endroit où se trouve la configuration à partager et qui est éventuellement réutilisée dans les modules enfants. Entre autres, nous pouvons utiliser icidependencyManagement oupluginManagement.

6.2. Création de sous-modules

Comme notre POM parent a été nomméparent-project, nous devons nous assurer que nous sommes dans le répertoire parent et exécuter les commandesgenerate:

cd parent-project
mvn archetype:generate -DgroupId=org.example  -DartifactId=core
mvn archetype:generate -DgroupId=org.example  -DartifactId=service
mvn archetype:generate -DgroupId=org.example  -DartifactId=webapp

Notez la commande utilisée. C'est la même chose que nous avons utilisée pour le parent. Le fait est que ces modules sont des projets Maven réguliers, mais Maven a reconnu qu’ils étaient imbriqués. Lorsque nous avons changé le répertoire enparent-project, nous avons constaté que le parent avait un empaquetage de typepom et modifié les deux fichierspom.xml en conséquence.

Après cela, Maven générera trois sous-modules et modifiera pour nous le fichierpom.xml du parent en ajoutant quelques balises:


    core
    service
    webapp

Maintenant, notre parent déclare explicitement les modules agrégés.

Ensuite, lors de l'exécution de la commandemvn package dans le répertoire du projet parent, Maven construira et testera les trois modules.

De plus, Maven Reactor analysera notre projet et le construira dans le bon ordre. Donc, si notre modulewebapp dépend du modulethe service, Maven construira d'abord lesservice, puis leswebapp.

Après tout, si nous souhaitons partager toute la configuration avec nos sous-modules, dans leurs fichierspom.xml, nous devrons déclarer le parent:


    org.example
    parent-project
    1.0-SNAPSHOT

Nous devons noter que les sous-modules ne peuvent avoir qu'un seul parent. Cependant, nous pouvons importer de nombreuses nomenclatures. Vous trouverez plus de détails sur les fichiers de nomenclature dansthis article.

6.3. Construire le projet

Now we can build all three modules at once. Dans le répertoire du projet du parent, exécutez:

mvn package

Ceci construira tous les modules, nous devrions voir le résultat suivant de la commande:

[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO] parent-project
[INFO] core
[INFO] service
[INFO] webapp
...
[INFO] Reactor Summary:
[INFO] parent-project ..................................... SUCCESS [  0.140 s]
[INFO] core ............................................... SUCCESS [  2.195 s]
[INFO] service ............................................ SUCCESS [  0.767 s]
[INFO] webapp ............................................. SUCCESS [  0.572 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

Le Reactor répertorie lesparent-project, mais comme il est de typepom, il est exclu et la construction donne trois fichiers.jar séparés pour tous les autres modules. Dans ce cas, la construction se produit dans trois d'entre eux.

7. Conclusion

Dans ce tutoriel, nous avons discuté des avantages de l’utilisation de multi-modules Maven. De plus, nous avons distingué le POM parent de Maven standard et le POM agrégé. Au final, nous avons montré comment mettre en place un multi-module simple pour commencer à jouer.

Maven est un excellent outil, mais il est complexe en soi. Si vous souhaitez en savoir plus sur Maven, jetez un œil auxSonatype Maven reference ouApache Maven guides. Si vous recherchez des utilisations avancées de la configuration multi-modules Maven, jetez un œil àhow Spring Boot project leverages the usage of it.

Tous les exemples de code sur l'exemple sont construits en utilisant Maven, vous pouvez donc facilement consulter nosGitHub project website pour voir diverses configurations Maven.