| Ce site met a disposition le build journalier de la traduction francaise du Maven: The Definitive Guide Consultez : | ![]() |
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.
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.