Projet multi-module avec Maven

1. Vue d'ensemble

Dans ce tutoriel, nous montrerons 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 mettrons en place notre exemple de projet. Pour une bonne introduction à Maven, consultez ce tutoriel.

2. Projet multi-modules de Maven

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

Désormais, les sous-modules sont des projets Maven classiques, et ils peuvent être construits séparément ou via l'agrégateur POM.

En construisant le projet via l'agrégateur POM, chaque projet dont le type de packaging est différent de pom aboutira à un fichier d'archive construit.

3. Avantages de l'utilisation de plusieurs modules

L’avantage majeur de l’utilisation de cette approche est que nous pouvons réduire les doubles emplois.

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 construire les deux composants séparément ou écrire un script qui compilerait le code, exécuterait des tests et afficherait les résultats. Ensuite, une fois que nous aurons encore plus de modules dans le projet, il deviendra plus difficile à gérer et à maintenir.

En outre, dans le monde réel, les projets peuvent avoir besoin de certains plugins Maven pour effectuer diverses opérations pendant le cycle de vie de la construction, partager des dépendances et des profils ou inclure d'autres projets de nomenclature.

Par conséquent, lors de l'utilisation de plusieurs modules, nous pouvons créer les modules de notre application en une seule commande et si l'ordre est important, Maven le découvrira pour nous. En outre, nous pouvons partager une grande quantité de configuration avec d'autres modules .

4. POM parent

Maven prend en charge l'héritage de manière à ce que chaque fichier pom.xml ait le POM parent implicite, il s'appelle Super POM et peut ê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 notre propre fichier pom.xml qui nous servira de projet parent . 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 POM déclare ses modules explicitement dans son fichier pom.xml.

5. Sous-modules

Les sous-modules ou sous-projets sont des projets Maven normaux qui héritent du POM parent. Comme nous le savons déjà, l'héritage nous permet 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 le parent ainsi que le POM agrégé.

6. Création de l'application

Maintenant que nous comprenons les sous-modules et la hiérarchie de Maven, construisons 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 cœur de notre domaine
  • Un service web fournissant des API REST
  • Une application Web contenant des ressources Web destinées aux utilisateurs

Puisque nous allons nous concentrer sur Maven, l'implémentation de ces services restera indéfinie.

6.1. Génération du POM parent

Commençons par créer un projet parent :

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

Une fois le parent généré, nous devons ouvrir le fichier pom.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 pas d'autres artefacts.

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

Cependant, nous devons noter que c'est là que se trouve toute la configuration à partager et éventuellement réutilisée dans les modules enfants. Entre autres, nous pouvons utiliser dependencyManagement ou pluginManagement ici.

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 commandes generate :

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

Notez la commande utilisée. C'est le même que nous avons utilisé 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 du projet parent , il a constaté que le parent avait un empaquetage de type pom et modifié les deux fichiers pom.xml en conséquence.

Après cela, Maven générera trois sous-modules et modifiera pour nous le fichier pom.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 commande mvn package dans le répertoire du projet parent, Maven construira et testera les trois modules.

Moreover, Maven Reactor will analyze our project and build it in proper order. So, if our webapp module depends on the service module, Maven will build first the service, then the webapp.

After all, if we wish to share all the configuration with our submodules, in their pom.xml files, we'll have to declare the parent:

 org.baeldung parent-project 1.0-SNAPSHOT 

We need to note, that submodules can have only one parent. However, we can import many BOMs. More details about the BOM files can be found in this article.

6.3. Building the Project

Now we can build all three modules at once. In the parent's project directory, run:

mvn package

This will build all the modules, we should see the following output of the command:

[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] ------------------------------------------------------------------------

The Reactor lists the parent-project, but as it's pom type it's excluded and the build results in three separate .jar files for all other modules. In that case, build occurs in three of them.

7. Conclusion

In this tutorial, we discussed the benefits of using Maven multi-modules. Also, we distinguished between regular Maven's parent POM and aggregate POM. In the end, we showed how to set up a simple multi-module to start to play with.

Maven is a great tool but it is complex on its own. If you'd like to find more details about Maven, have a look at the Sonatype Maven reference or Apache Maven guides. If you seek advanced usages of Maven multi-modules set up, have a look how Spring Boot project leverages the usage of it.

Tous les exemples de code sur Baeldung sont construits à l'aide de Maven, vous pouvez donc facilement consulter notre site Web de projet GitHub pour voir diverses configurations Maven.