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


    9.4.6. Gestion des dépendances

    Une fois que vous avez adopté Maven dans votre multinationale, vous allez vous demander s'il n'existe pas une meilleure manière de gérer les versions des dépendances dans vos deux cent vingt projets Maven interdépendants. Si chaque projet qui utilise une dépendance comme le connecteur Java de MySQL doit gérer dans son coin le numéro de version de cette dépendance, vous allez au-devant de graves problèmes le jour où vous allez faire évoluer cette version. Puisque les numéros de version sont répartis sur toute l'arborescence du projet, vous allez devoir éditer à la main chacun des fichiers pom.xml qui fait référence à cette dépendance pour être sûr de mettre à jour ce numéro de version partout. Même avec des commandes comme find, xargs, et awk, vous risquez d'oublier un POM.

    Heureusement, Maven fournit un moyen de consolider le numéro de version d'une dépendance grâce à la balise dependencyManagement. Vous rencontrerez habituellement la balise dependencyManagement dans un POM parent de haut niveau d'une organisation ou d'un projet. L'utilisation de la balise dependencyManagement dans un fichier pom.xml vous permet de référencer une dépendance dans un projet fils sans avoir à spécifier la version. Maven va parcourir la hiérarchie des POMs jusqu'à ce qu'il trouve un projet avec une balise dependencyManagement, il utilisera alors la version déclarée dans cette balise dependencyManagement.

    Par exemple, si vous avez un grand nombre de projets qui utilisent le connecteur Java MySQL dans sa version 5.1.2, vous pourriez écrire la balise dependencyManagement suivante dans le POM de plus haut niveau de votre projet multimodule.

    Exemple 9.9. Définition des versions dans un POM de haut niveau

    <project>
      <modelVersion>4.0.0</modelVersion>
      <groupId>org.sonatype.mavenbook</groupId>
      <artifactId>a-parent</artifactId>
      <version>1.0.0</version>
      ...
      <dependencyManagement>
        <dependencies>
          <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.2</version>
          </dependency>
          ...
        <dependencies>
      </dependencyManagement>
    

    Vous pourrez alors, dans un projet fils, ajouter une dépendance au connecteur Java MySQL avec le XML suivant :

    <project>
      <modelVersion>4.0.0</modelVersion>
      <parent>
        <groupId>org.sonatype.mavenbook</groupId>
        <artifactId>a-parent</artifactId>
        <version>1.0.0</version>
      </parent>
      <artifactId>project-a</artifactId>
      ...
      <dependencies>
        <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
        </dependency>
      </dependencies>
    </project>

    Faites attention au fait que le projet fils n'a pas déclaré explicitement la version de la dépendance à mysql-connector-java. Comme cette dépendance a été déclarée dans la balise dependencyManagement du POM de plus haut niveau, le numéro de version va se propager jusqu'à la dépendance mysql-connector-java du projet fils. Attention, si le projet fils avait défini une version, celle-ci aurait remplacé la version définie dans la section dependencyManagement du POM de plus haut niveau. Tout cela signifie que la version déclarée dans dependencyManagement n'est utilisée que lorsque le projet fils ne déclare pas de version.

    La gestion des dépendances avec un POM de haut niveau est différente de la déclaration d'une dépendance partagée au travers d'un POM parent. Pour commencer, toutes les dépendances sont héritées. Si mysql-connector-java était déclarée comme une dépendance du projet de plus haut niveau, chaque projet fils ferait référence à cette dépendance. Au lieu d'ajouter des dépendances inutiles, l'utilisation de la balise dependencyManagement vous permet de consolider et de centraliser la gestion des versions des dépendances sans ajouter de dépendances héritées par tous les projets fils. En d'autres termes, la balise dependencyManagement est équivalente à une variable d'environnement qui vous permet de déclarer une dépendance dans un sous-projet sans avoir à préciser de numéro de version.