Maven: comment remplacer la dépendance ajoutée par une bibliothèque
Voici mon problème générique:
Mon projet P dépend de la qui dépend de B qui dépend de C qui dépend de la version 1.0.1 de D.
Il y a un problème avec la version 1.0.1 de D et je veux forcer l'utilisation d'un autre module. Je ne sais pas comment déclarer dans mon projet de Pdm, puisque je n'ai pas ajouté une dépendance sur D directement. C'est C qui a déclaré que la dépendance sur D.
Important: Dans ce cas, non seulement la version est modifiée, mais le groupe & artefact ainsi. Il n'est donc pas juste une question de substitution de la version de la dépendance, mais plutôt, de l'exclusion d'un module et notamment un autre.
Dans le cas concret, D est StAX dont la version 1.0.1 a un bug. Selon les notes du bug, "les problèmes ont été résolu par le remplacement de la stax-api-1.0.1 (maven GroupId = stax) par stax-api-1.0-2 (maven GroupId = javax.xml.stream)" donc j'essaye juste que.
Ainsi, D = stax:stax-api:jar:1.0.1 et C = org.apache.xmlbeans:xmlbeans jar:2.3.0
Je suis en utilisant maven 2.0.9 en cas de questions.
Sortie de mvn dependency:tree"
mvn dependency:tree
[..snip..]
[INFO] +- org.apache.poi:poi-ooxml:jar:3.6:compile
[INFO] | +- org.apache.poi:poi-ooxml-schemas:jar:3.6:compile
[INFO] | | +- org.apache.xmlbeans:xmlbeans:jar:2.3.0:compile
[INFO] | | | \- stax:stax-api:jar:1.0.1:compile
Dans mon POM du projet, j'ai la dépendance suivant sur la "Une":
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.6</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.6</version>
</dependency>
Merci d'avance.
Vous devez vous connecter pour publier un commentaire.
Il suffit de spécifier la version actuelle de votre pom. La version spécifiée ici écraseront les autres.
Ressources :
Alternativement, vous pouvez simplement exclure la dépendance que vous ne souhaitez pas. STAX est inclus dans le JDK 1.6, donc si vous êtes à l'aide de 1,6 vous pouvez juste exclure entièrement.
Mon exemple ci-dessous est légèrement mal pour vous - vous avez seulement besoin de l'un des deux exclusions, mais je ne suis pas tout à fait sûr que l'on. Il existe d'autres versions de Stax flottant sur, dans mon exemple ci-dessous j'ai été à l'importation d'Un importées B qui a importé C & D, qui chacun (à travers encore plus dépendances transitives) importés de différentes versions de Stax. Donc, dans ma dépendance "A", j'exclus les deux versions de Stax.
J'ai aussi eu de la difficulté à prendre en compte une dépendance dans une bibliothèque tierce. J'ai utilisé du scot de l'approche, à l'exclusion, mais j'ai également ajouté de la dépendance avec la version la plus récente dans le pom. (J'ai utilisé Maven 3.3.3)
Donc pour le stAX exemple, il devrait ressembler à ceci:
Ce que vous mettez à l'intérieur de la
</dependencies>
étiquette de la racine pom sera compris par tous les enfants des modules de la racine pom. Si tous vos modules utiliser cette dépendance, c'est le chemin à parcourir.Cependant, si seulement 3 sur 10 de votre enfant modules utiliser certains de dépendance, vous ne voulez pas de cette dépendance pour être inclus dans tous de votre enfant modules. Dans ce cas, vous pouvez simplement mettre la dépendance à l'intérieur de la
</dependencyManagement>
. Cela permettra de s'assurer que tout enfant module qui a besoin de la dépendance doivent déclarer dans leur propre pom fichier, mais ils utilisent la même version de cette dépendance, comme spécifié dans votre</dependencyManagement>
tag.Vous pouvez également utiliser le
</dependencyManagement>
de modifier la version utilisée dans les dépendances transitives, parce que la version déclaré dans la partie supérieure de la plupart des pom le fichier est celui qui sera utilisé. Cela peut être utile si votre projet comporte un projet externe B v1.0 qui comprend un autre projet externe C v1.0. Il arrive parfois qu'une faille de sécurité est trouvé dans le projet C v1.0 qui est corrigé dans la v1.1, mais les développeurs de B sont lents à mettre à jour leur projet d'utilisation v1.1 de C. Dans ce cas, vous pouvez simplement déclarer une dépendance sur C v1.1 dans votre racine du projet à l'intérieur de pom `, et tout sera bien (en supposant que B v1.0 sera encore capable de compiler du C v1.1).