Les artefacts des dépendances peuvent être exclus en déclarant un élément dans une
Mais dans ce cas, il est nécessaire d’exclure un artefact hérité d’un projet parent. Voici un extrait du POM en discussion:
4.0.0 test jruby 0.0.1-SNAPSHOT base es.uniovi.innova 1.0.0 com.liferay.portal ALL-DEPS 1.0 provided pom
artefact de base
, dépend de javax.mail:mail-1.4.jar
et ALL-DEPS
dépend d’une autre version de la même bibliothèque. En raison du fait que mail.jar
de ALL-DEPS
existe dans l’environnement d’exécution, bien qu’il ne soit pas exporté, il entre en mail.jar
avec le mail.jar
existant sur le parent, qui est défini comme étant comstack
.
Une solution pourrait consister à débarrasser mail.jar du POM parent, mais la plupart des projets qui héritent de la base en ont besoin (de même qu’une dépendance transtive pour log4j). Donc, ce que je voudrais faire, c’est simplement exclure la bibliothèque des parents du projet enfant , comme cela pourrait être fait si base
était une dépendance et non le pom parent:
... base es.uniovi.innova 1.0.0 pom javax.mail mail ...
Quelques idées:
Peut-être que vous ne pourriez tout simplement pas hériter du parent dans ce cas (et déclarer une dépendance sur la base
avec l’exclusion). Pas pratique si vous avez beaucoup de choses dans le pom parent.
Une autre chose à tester serait de déclarer l’artefact de mail
avec la version requirejse par ALL-DEPS
sous la dependencyManagement
dans le parent pom pour forcer la convergence (bien que je ne sois pas sûr que cela résoudra le problème de scope).
javax.mail mail ???
mail
de log4j si vous n’utilisez pas les fonctionnalités qui s’y rapportent (et c’est ce que je ferais): log4j log4j 1.2.15 provided javax.mail mail javax.jms jms com.sun.jdmk jmxtools com.sun.jmx jmxri
Vous pouvez regrouper vos dépendances dans un projet différent avec un pom
comme décrit dans les meilleures pratiques de Sonatypes:
4.0.0 base-dependencies es.uniovi.innova 1.0.0 pom javax.mail mail 1.4
et les référencer depuis votre parent-pom (regardez la dépendance
):
4.0.0 base es.uniovi.innova 1.0.0 pom base-dependencies es.uniovi.innova 1.0.0 pom
Votre projet-enfant hérite de ce parent-pom comme auparavant. Mais maintenant, la dépendance de messagerie peut être exclue dans le projet enfant dans le bloc dependencyManagement
:
4.0.0 test jruby 0.0.1-SNAPSHOT base es.uniovi.innova 1.0.0 base-dependencies es.uniovi.innova 1.0.0 javax.mail mail
Avez-vous essayé de déclarer explicitement la version de mail.jar souhaitée? La résolution de dépendance de Maven devrait l’utiliser pour la résolution des dépendances sur toutes les autres versions.
4.0.0 test jruby 0.0.1-SNAPSHOT base es.uniovi.innova 1.0.0 javax.mail mail VERSION-# provided com.liferay.portal ALL-DEPS 1.0 provided pom
Cela peut sembler extrême, mais de la même manière, “l’inheritance” est une raison pour laquelle certaines personnes tournent le dos à la programmation orientée object, ou de la même manière que les chirurgiens vous maintiennent en vie avec un pontage coronaire: supprimez le bloc quel que soit
vous avez besoin.
L’hypothèse selon laquelle le fractionnement des poms en un parent et un enfant pour une «réutilisation» et une «éviction de la redondance» devrait être ignoré et que vous devez d’abord répondre à vos besoins immédiats. La redondance a ses avantages, à savoir l’indépendance des complications externes.
C’est plus facile que cela puisse paraître si vous générez le pom effectif (eclipse le fournit mais vous pouvez le générer à partir de la ligne de commande).
Je veux utiliser logback
mais mon pom parent utilise log4j
et je ne veux pas aller et pousser la dépendance des autres enfants sur log4j dans leurs propres fichiers pom.xml
pour que le mien ne soit pas obstrué.
Vous pouvez obtenir beaucoup d’un parent, mais parfois votre parent ne sait pas ce qui est bon pour vous.
Redéfinissez la dépendance (dans l’enfant pom) avec le système de scope
pointant vers un fichier jar vide:
dependency.coming from.parent 0 system ${project.basedir}/empty.jar
Le fichier JAR ne peut contenir qu’un seul fichier vide:
touch empty.txt jar cvf empty.txt
Lorsque vous appelez un paquet mais que vous ne voulez pas de certaines de ses dépendances, vous pouvez faire quelque chose comme ça (dans ce cas, je ne voulais pas que l’ancien log4j soit ajouté car je devais utiliser le nouveau):
package package-pk ${package-pk.version} org.apache.logging.log4j log4j-core org.apache.logging.log4j log4j-api org.apache.logging.log4j log4j-core 2.5 org.apache.logging.log4j log4j-api 2.5
Cela fonctionne pour moi … mais je suis assez nouveau pour java / maven donc ce n’est peut-être pas optimal.
Le mieux est de faire les dépendances dont vous ne voulez pas toujours hériter de la transition.
Vous pouvez le faire en les marquant dans le pom parent avec la scope fournie.
Si vous souhaitez toujours que le parent gère les versions de ces deps, vous pouvez utiliser la
pour configurer les versions souhaitées sans les hériter explicitement ou transmettre cet inheritance aux enfants.