Ce site met a disposition le build journalier de la traduction francaise du Maven: The Definitive Guide
Consultez :
  • Les documents de reference sur le projet original
  • Les sources de la traduction fr sur GitHub
  • maven


    3.5.3. Héritage de projet

    Parfois, nous voulons qu'un projet hérite de certaines valeurs d'un POM parent. Vous pourriez être en train de construire un énorme système, et vous ne voulez pas répéter les mêmes balises de dépendance encore et encore. Vous pouvez éviter de vous répéter dans vos projets par l'héritage grâce à la balise parent. Quand un projet spécifie un parent, il hérite de l'ensemble des informations du POM du projet parent. Il peut redéfinir les valeurs du POM parent et en ajouter.

    Tous les POMs de Maven héritent d'un POM parent. Si un POM ne spécifie pas de parent direct au travers de la balise parent, ce POM héritera des valeurs définies dans le Super POM. L'Exemple 3.12, « Héritage entre projets » présente la balise parent du project-a qui hérite du POM du projet a-parent.

    Exemple 3.12. Héritage entre projets

    <project>
      <parent>
        <groupId>com.training.killerapp</groupId>
        <artifactId>a-parent</artifactId>
        <version>1.0-SNAPSHOT</version>
      </parent>
      <artifactId>project-a</artifactId>
      ...
    </project>
    

    L'exécution de la commande mvn help:effective-pom dans le project-a va afficher un POM qui est le résultat de la fusion du Super POM avec le POM du projet a-parent et celui du project-a. Les héritages implicites et explicites du project-a sont présentés dans Figure 3.4, « Héritage pour les projets a-parent et project-a ».

    Héritage pour les projets a-parent et project-a

    Figure 3.4. Héritage pour les projets a-parent et project-a


    Quand un projet spécifie un projet parent, Maven utilise le POM de ce parent comme point de départ avant de traiter le POM du projet courant. Il hérite de tout, jusqu'au groupId et au numéro de version. Vous pouvez remarquer que le project-a ne spécifie aucun des deux, le groupId et la version sont tous les deux hérités du projet a-parent. Lorsqu'une balise parent est présente, tout ce qu'un POM a besoin de définir est l'artifactId. Cela n'est pas obligatoire, le project-a peut avoir un groupId et une version différents de ceux du parent, mais s'ils ne sont pas définis alors Maven utilisera ceux du POM parent. Si vous commencez à utiliser Maven pour gérer et construire de gros projets multimodules, vous aurez souvent à créer des projets qui auront un même groupId et une même version.

    Quand vous héritez d'un POM, vous avez le choix entre utiliser les valeurs héritées de ce POM ou les surcharger sélectivement. Ce qui suit est une liste d'éléments qu'un POM Maven hérite de son POM parent :

    • les identifiants (il faut au moins surcharger le groupId ou l'artifactId).

    • les dépendances

    • les développeurs et les contributeurs

    • les listes de plugins

    • les listes de rapports

    • les exécutions de plugin (les exécutions qui ont le même id sont fusionnées)

    • les configuration de plugin

    Quand Maven hérite de dépendances, il va ajouter les dépendances définies dans les projets fils à celles des projets parents. C'est ainsi que vous pouvez spécifier des dépendances utilisées tout au long de projets qui héritent d'un même POM parent. Par exemple, si votre projet fait usage de Log4J pour ses traces, vous pouvez ajouter cette dépendance dans votre POM de plus haut niveau. Tous les projets qui hériteront de ce POM auront automatiquement Log4J comme dépendance. De même, si vous voulez vous assurer que tous vos projets utilisent la même version d'un plugin Maven, vous pouvez définir la version de ce plugin Maven dans la section pluginManagement d'un POM parent de haut niveau.

    Maven assume que le POM parent est disponible dans le dépôt local ou dans le répertoire parent (../pom.xml) du projet courant. Si aucune de ces options n'est valide, ce comportement par défaut peut être redéfini par la balise relativePath. Par exemple, certaines organisations préfèrent une structure à plat des projets où le fichier pom.xml du projet parent ne se trouve pas dans le répertoire parent d'un projet fils. Il peut se trouver dans un répertoire au même niveau que celui du projet. Si votre projet fils se trouve dans le répertoire ./projet-a et que le projet parent se trouve dans ./a-parent, vous préciserez dans le POM le chemin relatif du projet parent-a ainsi :

    <project>
      <parent>
        <groupId>org.sonatype.mavenbook</groupId>
        <artifactId>a-parent</artifactId>
        <version>1.0-SNAPSHOT</version>
        <relativePath>../a-parent/pom.xml</relativePath>
      </parent>
      <artifactId>projet-a</artifactId>
    </project>