Existe-t-il de toute façon d’exclure des artefacts hérités d’un POM parent?

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:

  1. 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.

  2. 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 ???    
  1. Ou vous pouvez exclure la dépendance de 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    
  1. Ou vous pouvez revenir à la version 1.2.14 de log4j au lieu de la version 1.2.15 hérétique (pourquoi n’ont-ils pas marqué les dépendances ci-dessus comme facultatives ?!).

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 pom ):

  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    

Ne pas utiliser un pom parent

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).

Exemple

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.