Projet Maven multi-modules

De EjnTricks

Un des grands principes du développement est de faire simple et des méthodes / fonctions courtes, afin d'éviter les difficultés de maintenance du code produit. C'est pourquoi il est courant de voir l'introduction de Design Pattern, et un éclatement en différents modules. Le gros avantage, c'est de pouvoir basculer d'une librairie à une autre, par exemple en cas de changement de base de données.

L'application est alors composée de plusieurs modules. Maven va permettre d'organiser son espace de travail en multiple projets Java mais au sein d'un projet "chapeau". Cet article se propose de décrire la mise en place d'une telle organisation.

Hand-icon.png Votre avis

Current user rating: 100/100 (1 votes)

 You need to enable JavaScript to vote


Viewer icon.png Objectif

A noter, la configuration du pom parent présenté dans ce paragraphe est une première version. Une meilleure gestion des références, dépendances et plugins, est mentionnée dans le paragraphe Gestion des dépendances.

Dans le cadre de cet example, avec Maven 2.2.X, l'application de démonstration sera composée de quatre module.

Module Nom Description
DAO jouvinio-dao Déclaration des signatures des Data Access Objects.
Implémentation DAO jouvinio-daoImpl Une implémentation des DAOs.
Objets jouvinio-datas Représentation Java des objets.
Service jouvinio-service Implémentation de services consommant les DAOs.

Cette organisation respecte un Design Pattern courant, visant à séparer la couche d'interrogation des données, DAOs, la représentation de ces données qui pourraient être lues depuis une base, et les services qui sont des actions un peu plus complexes sur ces données. Les services consomment les fonctions / méthodes définies au niveau des DAOs.

A noter que les signatures et l'implémentation des DAOs sont découpées dans deux modules. Ceci permet une bascule rapide, utilisation d'une vraie connexion à une base ou d'un mock par exemple.


Home icon.png Projet parent

Un projet parent / maître est nécessaire pour la mise en place d'une telle organisation. Sa déclaration est exactement la même que pour tout type de projet, mais la valeur pom pour la définition packaging.

Le contenu du fichier pom.xml est le suivant:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <artifactId>jouvinio-multi</artifactId>
    <description>Exemple de mise en place d'un projet Maven avec multiples modules</description>
    <groupId>fr.ejn.tutorial.maven-multi</groupId>
    <modelVersion>4.0.0</modelVersion>
    <name>Multi modules Maven</name>
    <packaging>pom</packaging>
    <version>1.0</version>

    <dependencies>
        <dependency>
            <artifactId>junit</artifactId>
            <groupId>junit</groupId>
            <scope>test</scope>
            <version>${junit.version}</version>
        </dependency>
    </dependencies>

    <reporting>
        <plugins>
        </plugins>
    </reporting>

    <build>
        <sourceDirectory>src/main/java</sourceDirectory> 
        <testSourceDirectory>src/test/java</testSourceDirectory>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
            </resource>
        </resources>
        <testResources>
            <testResource>
                <directory>src/test/resources</directory>
            </testResource>
        </testResources>
        <plugins>
            <plugin>
                <artifactId>maven-eclipse-plugin</artifactId>
                <configuration>
                    <downloadJavadocs>true</downloadJavadocs>
                    <downloadSources>true</downloadSources>
                    <wtpversion>2.0</wtpversion>
                </configuration>
                <groupId>org.apache.maven.plugins</groupId>
                <version>2.8</version>
            </plugin>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
                <groupId>org.apache.maven.plugins</groupId>
            </plugin>
        </plugins>
    </build>

    <properties>
        <commons.lang.version>3.2.1</commons.lang.version>
        <junit.version>4.11</junit.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

</project>

Il n'y a donc rien de particulier dans cette déclaration et cela permet de configurer le projet.

Paramètre Valeur Description
Définition
artifactId jouvinio-multi Identifiant du module parent.
description Exemple de mise en place d'un projet

Maven avec multiples modules

Description du module.
groupId fr.ejn.tutorial.maven-multi Groupe du projet.
name Multi modules Maven Nom du module.
packaging pom Type du module. Cette valeur DOIT être pom dans le cas du module parent.
version 1.0 Numéro de version du projet
Dépendances
dependency junit Utilisation de JUnit avec la version définie dans junit.version, dans le scope test.
Organisation sources
sourceDirectory src/main/java Le code source Java sera mis en place dans ce répertoire.

Correspond à une organisation généralement utilisée dans tout projet Maven.

testSourceDirectory src/test/java Le code source Java des tests unitaires sera mis en place dans ce répertoire.

Correspond à une organisation généralement utilisée dans tout projet Maven.

resource.directory src/main/resources Les fichiers ressource pour le code seront mis en place dans ce répertoire.

Correspond à une organisation généralement utilisée dans tout projet Maven.

resource.directory src/test/resources Les fichiers ressource pour les tests unitaires seront mis en place dans ce répertoire.

Correspond à une organisation généralement utilisée dans tout projet Maven.

Plugins
plugin maven-eclipse-plugin Utilisation du plugin pour Eclipse, en version 2.8.

Le plugin est configuré pour télécharger les sources et la Javadoc des dépendances utilisées.

plugin maven-compiler-plugin Utilisé avec de spécifier la compatibilité des sources et de la compilation.
Valeurs de propriétés, utilisées dans les fichiers pom.xml
commons.lang.version 3.2.1 Utilisation de la version 3.2.1 pour la librairie commons-lang3.
junit.version 4.11 Utilisation de la version 3.2.1 pour la librairie junit.
project.build.sourceEncoding UTF-8 Définition de l'encoding des fichiers sources.

Attention à ce stade, le fichier pom.xml n'est pas encore complet. Mais il mérite déjà deux points d'attention :

  • La déclaration de la dépendance sur junit à ce niveau va permettre de l'appliquer dans tous les projets "fils". Ainsi, il n'est pas nécessaire de répercuter cette dépendance à chaque fois.
  • Le principe est identique pour les propriétés. Elles sont centralisées au niveau du projet parent et accessibles dans tous les fils. C'est très pratique pour appliquer la même version des librairies sur l'ensemble des modules.
  • L'organisation des sources et ressource s'appliquera sur tous les sous modules, simplifiant alors leur déclaration.


Multiples-icon.png Configuration modules

Dans le fichier pom.xml des modules, il est nécessaire de référencer le pom parent. Toutefois, il n'est pas nécessaire de répéter les informations groupId et version, celles-ci seront récupérées depuis le fichier parent.

Icon-database.png Objets

Ce module, nommé jouvinio-datas doit être placé dans un sous répertoire, de même nom, du module parent. Doit également être présent un fichier pom.xml afin de définir ce sous module.

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <artifactId>jouvinio-datas</artifactId>
    <description>Déclaration des données pour l'exemple de mise en place d'un projet Maven avec multiples modules</description>
    <modelVersion>4.0.0</modelVersion>
    <name>Datas module</name>
    <packaging>jar</packaging>

    <parent>
        <artifactId>jouvinio-multi</artifactId>
        <groupId>fr.ejn.tutorial.maven-multi</groupId>
        <relativePath>../pom.xml</relativePath>
        <version>1.0</version>
    </parent>

    <dependencies>
    </dependencies>

    <properties>
        <parentBasedir>../</parentBasedir>
    </properties>
    
</project>

Ce premier module va contenir la modélisation Java des objets. Il n'a aucune dépendance et doit uniquement référencer le module parent, via le contenu de la balise parent. La valeur de relativePath permet d'identifier l'emplacement du fichier pom.xml parent, qui est généralement dans le répertoire père, cf l'organisation des répertoires en fin d'article.

A noter, la valeur de groupId est la même que celle du parent.

Icon-database-search.png DAO

Ce module, nommé jouvinio-dao doit être placé dans un sous répertoire, de même nom, du module parent. Doit également être présent un fichier pom.xml afin de définir ce sous module.

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <artifactId>jouvinio-dao</artifactId>
    <description>Déclaration DAO pour l'exemple de mise en place d'un projet Maven avec multiples modules</description>
    <modelVersion>4.0.0</modelVersion>
    <name>DAO module</name>
    <packaging>jar</packaging>

    <parent>
        <artifactId>jouvinio-multi</artifactId>
        <groupId>fr.ejn.tutorial.maven-multi</groupId>
        <relativePath>../pom.xml</relativePath>
        <version>1.0</version>
    </parent>

    <dependencies>
        <dependency>
            <artifactId>jouvinio-datas</artifactId>
            <groupId>${project.groupId}</groupId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>

    <properties>
        <parentBasedir>../</parentBasedir>
    </properties>
    
</project>

Ce module définit la signature des DAOs, globalement que des interfaces. La seule dépendance est sur le projet jouvinio-datas, déclarée dans dependencies.

A noter, l'utilisation des synthaxes ${project.groupId} et ${project.version} qui permettent de ne pas avoir à recopier les valeurs.

Icon-database-process.png Implémentation DAO

Ce module, nommé jouvinio-daoImpl doit être placé dans un sous répertoire, de même nom, du module parent. Doit également être présent un fichier pom.xml afin de définir ce sous module.

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <artifactId>jouvinio-daoImpl</artifactId>
    <description>Implémentation DAO pour l'exemple de mise en place d'un projet Maven avec multiples modules</description>
    <modelVersion>4.0.0</modelVersion>
    <name>DAO implementation module</name>
    <packaging>jar</packaging>

    <parent>
        <artifactId>jouvinio-multi</artifactId>
        <groupId>fr.ejn.tutorial.maven-multi</groupId>
        <relativePath>../pom.xml</relativePath>
        <version>1.0</version>
    </parent>

    <dependencies>
        <dependency>
            <artifactId>jouvinio-dao</artifactId>
            <groupId>${project.groupId}</groupId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <artifactId>jouvinio-datas</artifactId>
            <groupId>${project.groupId}</groupId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>

    <properties>
        <parentBasedir>../</parentBasedir>
    </properties>
    
</project>

Ce module contient les implémentations des DAOs. Il est donc naturellement dépendant des déclarations dans le module jouvinio-dao.

Le reste de la configuration reprend les principes énoncés précédemment.

Share-icon.png Service

Ce module, nommé jouvinio-service doit être placé dans un sous répertoire, de même nom, du module parent. Doit également être présent un fichier pom.xml afin de définir ce sous module.

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <artifactId>jouvinio-service</artifactId>
    <description>Implémentation service pour l'exemple de mise en place d'un projet Maven avec multiples modules</description>
    <modelVersion>4.0.0</modelVersion>
    <name>Service module</name>
    <packaging>jar</packaging>

    <parent>
        <artifactId>jouvinio-multi</artifactId>
        <groupId>fr.ejn.tutorial.maven-multi</groupId>
        <relativePath>../pom.xml</relativePath>
        <version>1.0</version>
    </parent>

    <dependencies>
        <dependency>
            <artifactId>commons-lang3</artifactId>
            <groupId>org.apache.commons</groupId>
            <version>${commons.lang.version}</version>
        </dependency>
        <dependency>
            <artifactId>jouvinio-dao</artifactId>
            <groupId>${project.groupId}</groupId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <artifactId>jouvinio-daoImpl</artifactId>
            <groupId>${project.groupId}</groupId>
            <scope>test</scope>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <artifactId>jouvinio-datas</artifactId>
            <groupId>${project.groupId}</groupId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>

    <properties>
        <parentBasedir>../</parentBasedir>
    </properties>
    
</project>

Ce module contient les implémentations des services. Dans le cadre de cet article, il est supposé que les implémentations des DAOs mises en place seront utilisées uniquement pour les test unitaires, comme pour "mocker" un accès à une base de données. C'est pourquoi, il est mentionné le scope test pour la dépendance jouvinio-daoImpl. Il est d'ailleurs recommander de n'utiliser que les interfaces des DAOs au niveau des services et non pas les implémentations, permettant de brancher / débrancher facilement une implémentation avec des outils comme Spring FrameworkSpring.

Le reste de la configuration reprend les principes énoncés précédemment.


Dependencies.gif Références

Pour chacun des sous modules, il faut qu'il soit contenu dans un sous répertoire de même nom. Dans le cadre de cet exemple, il en résulte l'organisation suivante :


Pour rappel, la déclaration vers le module parent est mise en place dans chacun des fichiers pom.xml des sous modules.

Une fois tous les modules en place, il faut les relier entre eux. Pour cela, il faut renseigner un noeud modules, contenant des noeuds fils module ayant pour nom du sous module comme texte. Le contenu du fichier pom.xml devient donc le suivant.

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <artifactId>jouvinio-multi</artifactId>
    <description>Exemple de mise en place d'un projet Maven avec multiples modules</description>
    <groupId>fr.ejn.tutorial.maven-multi</groupId>
    <modelVersion>4.0.0</modelVersion>
    <name>Multi modules Maven</name>
    <packaging>pom</packaging>
    <version>1.0</version>

    <dependencies>
        <dependency>
            <artifactId>junit</artifactId>
            <groupId>junit</groupId>
            <scope>test</scope>
            <version>${junit.version}</version>
        </dependency>
    </dependencies>

    <reporting>
        <plugins>
        </plugins>
    </reporting>

    <build>
        <sourceDirectory>src/main/java</sourceDirectory> 
        <testSourceDirectory>src/test/java</testSourceDirectory>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
            </resource>
        </resources>
        <testResources>
            <testResource>
                <directory>src/test/resources</directory>
            </testResource>
        </testResources>
        <plugins>
            <plugin>
                <artifactId>maven-eclipse-plugin</artifactId>
                <configuration>
                    <downloadJavadocs>true</downloadJavadocs>
                    <downloadSources>true</downloadSources>
                    <wtpversion>2.0</wtpversion>
                </configuration>
                <groupId>org.apache.maven.plugins</groupId>
                <version>2.8</version>
            </plugin>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
                <groupId>org.apache.maven.plugins</groupId>
            </plugin>
        </plugins>
    </build>

    <modules>
        <module>jouvinio-dao</module>
        <module>jouvinio-daoImpl</module>
        <module>jouvinio-datas</module>
        <module>jouvinio-service</module>
    </modules>

    <properties>
        <commons.lang.version>3.2.1</commons.lang.version>
        <junit.version>4.11</junit.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

</project>

Le projet est maintenant configuré sans sa globalité. Les actions, compilation / installation / construction projet Eclipse / etc, peuvent être réalisées depuis la racine pour s'appliquer à tous les modules, ou sous un module particulier.

Le projet, pour cette description, est disponible sous ce lien : http://www.dev.jouvinio.net/svn/study/tags/studyMavenMulti/1.0/


Configuration-icon.png Gestion des dépendances

Dans la première description des fichiers pom, les dépendances et plugins sont inclus dans chacun des poms, en spécifiant un numéro de version centralisé dans le pom parent. Cependant, il existe des déclarations permettant de centraliser ces numéros de version, et configuration, dans le pom parent. L'activation du(es) plugin(s) ou dépendance(s) est alors simplifiée dans les différents modules.

Une version 1.1 du projet précédent a été créée, et est disponible sous Le projet, pour cette description, est disponible sous ce lien : http://www.dev.jouvinio.net/svn/study/tags/studyMavenMulti/1.1/

Plugin-icon.png Plugins

La centralisation des plugins s'effectue à l'aide de la configuration pluginManagement, sous le noeud build. Ainsi, il est possible de spécifier les configuration des plugins qui seront utilisés au sein du projet. La section dans le fichier pom est la suivante.

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <groupId>org.apache.maven.plugins</groupId>
                    <configuration>
                        <source>1.7</source>
                        <target>1.7</target>
                    </configuration>
                    <version>3.5.1</version>
                </plugin>
            </plugins>
        </pluginManagement>
        <plugins>
            <plugin>
                <artifactId>maven-eclipse-plugin</artifactId>
                <configuration>
                    <downloadJavadocs>true</downloadJavadocs>
                    <downloadSources>true</downloadSources>
                    <wtpversion>2.0</wtpversion>
                </configuration>
                <groupId>org.apache.maven.plugins</groupId>
                <version>2.8</version>
            </plugin>
        </plugins>
    </build>

Dans les modules fils, l'utilisation d'un plugin est activée en spécifiant la valeur de artifactId et groupId comme l'exemple suivant.

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <groupId>org.apache.maven.plugins</groupId>
            </plugin>
        </plugins>
    </build>

Dependencies.gif Dépendances

De la même façon, les spécifications des dépendances utilisées au sein des modules peut être centralisées dans le pom parent, à l'aide du noeud dependencyManagement. Dans le cadre de cet exemple, les dépendances commons-collections4 et commons-lang3 sont utilisées. L'externalisation est réalisée à l'ai de la configuraiton suivante.

    <dependencyManagement>
        <dependencies>
            <dependency>
                <artifactId>commons-collections4</artifactId>
                <groupId>org.apache.commons</groupId>
                <version>${commons-collections4.version}</version>
            </dependency>
            <dependency>
                <artifactId>commons-lang3</artifactId>
                <groupId>org.apache.commons</groupId>
                <version>${commons.lang.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

Dans cet extrait, les numéros de versions sont récupérées à l'aide des propriétés définies sous le noeud properties.

Dans les modules fils, l'utilisation d'une dépendance est activée en spécifiant la valeur de artifactId et groupId comme l'exemple suivant.

    <dependencies>
        <dependency>
            <artifactId>commons-collections4</artifactId>
            <groupId>org.apache.commons</groupId>
        </dependency>
    </dependencies>

Home icon.png Projet parent

Ainsi, le pom parent devient celui-ci, après modification des numéros de version.

Paramètre Valeur Description
Plugins
maven-eclipse-plugin 2.8 Utilisation du plugin pour Eclipse.

Le plugin est configuré pour télécharger les sources et la Javadoc des dépendances utilisées.

maven-compiler-plugin 3.5.1 Utilisé avec de spécifier la compatibilité des sources et de la compilation.
Valeurs de propriétés, utilisées dans les fichiers pom.xml
commons-collections4.version 4.1 Utilisation de la version 4.1 pour la librairie commons-lang3.
commons.lang.version 3.4 Utilisation de la version 3.4 pour la librairie commons-lang3.
junit.version 4.12 Utilisation de la version 4.12 pour la librairie junit.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <artifactId>jouvinio-multi</artifactId>
    <description>Exemple de mise en place d'un projet Maven avec multiples modules</description>
    <groupId>fr.ejn.tutorial.maven-multi</groupId>
    <modelVersion>4.0.0</modelVersion>
    <name>Multi modules Maven</name>
    <packaging>pom</packaging>
    <version>1.1</version>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <artifactId>commons-collections4</artifactId>
                <groupId>org.apache.commons</groupId>
                <version>${commons-collections4.version}</version>
            </dependency>
            <dependency>
                <artifactId>commons-lang3</artifactId>
                <groupId>org.apache.commons</groupId>
                <version>${commons.lang.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <artifactId>junit</artifactId>
            <groupId>junit</groupId>
            <scope>test</scope>
            <version>${junit.version}</version>
        </dependency>
    </dependencies>

    <reporting>
        <plugins>
        </plugins>
    </reporting>

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <groupId>org.apache.maven.plugins</groupId>
                    <configuration>
                        <source>1.7</source>
                        <target>1.7</target>
                    </configuration>
                    <version>3.5.1</version>
                </plugin>
            </plugins>
        </pluginManagement>
        <plugins>
            <plugin>
                <artifactId>maven-eclipse-plugin</artifactId>
                <configuration>
                    <downloadJavadocs>true</downloadJavadocs>
                    <downloadSources>true</downloadSources>
                    <wtpversion>2.0</wtpversion>
                </configuration>
                <groupId>org.apache.maven.plugins</groupId>
                <version>2.8</version>
            </plugin>
        </plugins>
    </build>

    <modules>
        <module>jouvinio-dao</module>
        <module>jouvinio-daoImpl</module>
        <module>jouvinio-datas</module>
        <module>jouvinio-service</module>
    </modules>

    <properties>
        <commons-collections4.version>4.1</commons-collections4.version>
        <commons.lang.version>3.4</commons.lang.version>
        <junit.version>4.12</junit.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

</project>

Cet exemple met en évidence les deux modes de configuration. Par exemple, la dépendance junit sera affectée par défaut à tous les modules. Alors que les dépendances commons-collections4 et commons-lang3 sont simplement configurées pour utilisation.

Multiples-icon.png Configuration modules

Cette utilisation est mise en évidence dans le pom du module jouvinio-daoImpl.

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <artifactId>jouvinio-daoImpl</artifactId>
    <description>Implémentation DAO pour l'exemple de mise en place d'un projet Maven avec multiples modules</description>
    <modelVersion>4.0.0</modelVersion>
    <name>DAO implementation module</name>
    <packaging>jar</packaging>

    <parent>
        <artifactId>jouvinio-multi</artifactId>
        <groupId>fr.ejn.tutorial.maven-multi</groupId>
        <relativePath>../pom.xml</relativePath>
        <version>1.1</version>
    </parent>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <groupId>org.apache.maven.plugins</groupId>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <artifactId>commons-collections4</artifactId>
            <groupId>org.apache.commons</groupId>
        </dependency>
        <dependency>
            <artifactId>jouvinio-dao</artifactId>
            <groupId>${project.groupId}</groupId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <artifactId>jouvinio-datas</artifactId>
            <groupId>${project.groupId}</groupId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>

    <properties>
        <parentBasedir>../</parentBasedir>
    </properties>
    
</project>


Folder-icon.png Emplacement pom parent

Une version 1.2 du projet précédent a été créée, et est disponible sous Le projet, pour cette description, est disponible sous ce lien : http://www.dev.jouvinio.net/svn/study/tags/studyMavenMulti/1.2/

Sur la première version de la configuration, le pom parent est placé au même niveau que les répertoires des modules. Ceci fonctionne très bien, mais peut engendrer des problèmes d'utilisation sous Eclipse, où il faudra placer le pom parent à la racin du workspace. Si le même workspace est utilisé pour différent projet, il devient compliqué de gérer ces poms parent, sans compter la synchronisation avec le gestionnaire de source.

Le plus simple est de créer un "module" qui sera le point d'entrée du projet. Dans le cadre de cet exemple, le "module" sera nommé jouvinio-multi. Le fichier pom est légèrement modifié pour référencer les modules.

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <artifactId>jouvinio-multi</artifactId>
    <description>Exemple de mise en place d'un projet Maven avec multiples modules</description>
    <groupId>fr.ejn.tutorial.maven-multi</groupId>
    <modelVersion>4.0.0</modelVersion>
    <name>Multi modules Maven</name>
    <packaging>pom</packaging>
    <version>1.2</version>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <artifactId>commons-collections4</artifactId>
                <groupId>org.apache.commons</groupId>
                <version>${commons-collections4.version}</version>
            </dependency>
            <dependency>
                <artifactId>commons-lang3</artifactId>
                <groupId>org.apache.commons</groupId>
                <version>${commons.lang.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <artifactId>junit</artifactId>
            <groupId>junit</groupId>
            <scope>test</scope>
            <version>${junit.version}</version>
        </dependency>
    </dependencies>

    <reporting>
        <plugins>
        </plugins>
    </reporting>

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <groupId>org.apache.maven.plugins</groupId>
                    <configuration>
                        <source>1.7</source>
                        <target>1.7</target>
                    </configuration>
                    <version>3.5.1</version>
                </plugin>
            </plugins>
        </pluginManagement>
        <plugins>
            <plugin>
                <artifactId>maven-eclipse-plugin</artifactId>
                <configuration>
                    <downloadJavadocs>true</downloadJavadocs>
                    <downloadSources>true</downloadSources>
                    <wtpversion>2.0</wtpversion>
                </configuration>
                <groupId>org.apache.maven.plugins</groupId>
                <version>2.8</version>
            </plugin>
        </plugins>
    </build>

    <modules>
        <module>../jouvinio-dao</module>
        <module>../jouvinio-daoImpl</module>
        <module>../jouvinio-datas</module>
        <module>../jouvinio-service</module>
    </modules>

    <properties>
        <commons-collections4.version>4.1</commons-collections4.version>
        <commons.lang.version>3.4</commons.lang.version>
        <junit.version>4.12</junit.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

</project>

La configuration des modules fils doit refléter le nouvel emplacement du pom parent avec les instructions suivantes dans les poms.

    <parent>
        <artifactId>jouvinio-multi</artifactId>
        <groupId>fr.ejn.tutorial.maven-multi</groupId>
        <relativePath>../jouvinio-multi/pom.xml</relativePath>
        <version>1.2</version>
    </parent>

L'arborescence est alors la suivante.