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.5. La gestion des dépendances de Maven

    Dans l'exemple de ce chapitre, Maven a résolu les coordonnées de la dépendance JUnit — junit:junit:3.8.1 — sous la forme d'un chemin dans un dépôt Maven /junit/junit/3.8.1/junit-3.8.1.jar. C'est cette capacité à trouver un artefact dans un dépôt à partir de ses coordonnées qui nous permet de définir les dépendances dans le POM du projet. Si vous examinez le fichier pom.xml du projet simple, vous verrez qu'il comporte une section dependencies pour traiter des dépendances et que cette section contient une seule dépendance — JUnit.

    Un projet plus complexe contiendrait sûrement plusieurs dépendances, ou pourrait avoir des dépendances qui dépendent elles-mêmes d'autres artefacts. L'une des principales forces de Maven est sa gestion des dépendances transitives. Supposons que votre projet dépende d'une bibliothèque qui à son tour dépend de 5 ou 10 autres bibliothèques (comme Spring ou Hibernate par exemple). Au lieu d'avoir à trouver et lister explicitement toutes ces dépendances dans votre fichier pom.xml, vous pouvez ne déclarer que la dépendance à la bibliothèque qui vous intéresse, Maven se chargera d'ajouter ses dépendances à votre projet implicitement. Maven va aussi gérer les conflits de dépendances, vous fournira le moyen de modifier son comportement par défaut et d'exclure certaines dépendances transitives.

    Regardons la dépendance téléchargée dans votre dépôt local lors de l'exemple précédent. Ouvrez dans votre dépôt local le répertoire ~/.m2/repository/junit/junit/3.8.1/. Si vous avez suivi les instructions de ce chapitre vous trouverez un fichier junit-3.8.1.jar et un fichier junit-3.8.1.pom avec quelques fichiers de checksum que Maven utilise pour vérifier l'intégrité des artefacts téléchargés. Remarquez que Maven n'a pas juste téléchargé le JAR de JUnit, mais aussi un fichier POM pour les dépendances de JUnit. C'est le téléchargement des fichiers POM en plus des artefacts qui est au cœur de la gestion des dépendances transitives par Maven.

    Quand vous installez l'artefact produit par votre projet dans le dépôt local, vous noterez que Maven publie une version légèrement modifiée du fichier pom.xml de votre projet dans le répertoire contenant le fichier JAR. Ce fichier POM enregistré dans le dépôt fournit aux autres projets des informations sur ce projet, dont notamment ses dépendances. Si le Projet B dépend du Projet A, il dépend aussi des dépendances du Projet A. Quand Maven résout une dépendance à partir de ses coordonnées, il récupère, en plus de l'artefact, le POM, puis il analyse les dépendances de ce POM pour trouver les dépendances transitives. Ces dépendances transitives sont ensuite ajoutées à la liste des dépendances du projet.

    Dans le monde de Maven, une dépendance n'est plus simplement un fichier JAR ; c'est un fichier POM qui à son tour peut déclarer de nouvelles dépendances. Ce sont ces dépendances de dépendances que l'on appelle dépendances transitives et cela est rendu possible par le fait que les dépôts Maven contiennent plus que du bytecode ; ils contiennent des métadonnées sur les artefacts.

    Résolution des dépendances transitives par Maven

    Figure 3.6. Résolution des dépendances transitives par Maven


    Dans le schéma précédent, le projet A dépend des projets B et C. Le Projet B dépend du projet D et le projet C dépend du projet E. L'ensemble des dépendances directes et transitives du projet A serait donc les projets B, C, D et E, mais tout ce que le projet A doit faire, c'est de déclarer ses dépendances aux projets B et C. Les dépendances transitives sont pratiques lorsque votre projet dépend d'autres projets qui ont leurs propres dépendances (comme Hibernate, Apache Struts, ou Spring Framework). Maven vous permet d'exclure certaines dépendances transitives du classpath du projet.

    Maven fournit enfin différentes portées pour les dépendances. Le fichier pom.xml du projet simple contient une unique dépendance — junit:junit:jar:3.8.1 — ayant pour portée test indiquée dans la balise scope. Lorsqu'une dépendance Maven a une portée de type test, elle n'est pas disponible pour le goal compile du plugin Compiler. Cette dépendance sera ajoutée au classpath des goals compiler:testCompile et surefire:test.

    Durant la création du JAR d'un projet, les dépendances ne sont pas intégrées à l'artefact produit ; elles ne sont utilisées que lors de la compilation. Par contre lorsque vous utilisez Maven pour produire un WAR ou un EAR, vous pouvez le configurer de manière à packager les dépendances avec l'artefact produit et vous pouvez même configurer Maven pour exclure certaines dépendances du fichier WAR par l'utilisation de la portée provided. La portée provided indique à Maven que la dépendance est nécessaire à la compilation, mais qu'elle ne doit pas être intégrée à l'artefact produit par le build. Cette portée est donc très pratique lorsque vous développez une application web. Vous aurez besoin du jar des spécifications Servlet pour compiler, mais vous ne voulez pas inclure le JAR de l'API Servlet dans le répertoire WEB-INF/lib.