Les artefacts des dépendances peuvent être exclus en déclarant un <exclusions>
élément à l'intérieur d'un <dependency>
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:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>test</groupId>
<artifactId>jruby</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<artifactId>base</artifactId>
<groupId>es.uniovi.innova</groupId>
<version>1.0.0</version>
</parent>
<dependencies>
<dependency>
<groupId>com.liferay.portal</groupId>
<artifactId>ALL-DEPS</artifactId>
<version>1.0</version>
<scope>provided</scope>
<type>pom</type>
</dependency>
</dependencies>
</project>
base
artefact, dépend 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
exist sur l'environnement d'exécution, bien que non exporté, entre en conflit avec le mail.jar
qui existe sur le parent, qui est défini comme compile
.
Une solution pourrait être de débarrasser mail.jar du POM parent, mais la plupart des projets qui héritent de la base en ont besoin (comme c'est une dépendance transtive pour log4j). Donc, ce que je voudrais faire, c'est simplement exclure la bibliothèque parent du projet enfant , comme cela pourrait être fait s'il base
s'agissait d'une dépendance et non du pom parent:
...
<dependency>
<artifactId>base</artifactId>
<groupId>es.uniovi.innova</groupId>
<version>1.0.0</version>
<type>pom<type>
<exclusions>
<exclusion>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
</exclusion>
</exclusions>
</dependency>
...
Vous pouvez regrouper vos dépendances dans un projet différent avec un packaging
pom
comme décrit par les bonnes pratiques de Sonatypes :et référencez-les à partir de votre parent-pom (regardez la dépendance
<type>pom</type>
):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
dependencyManagement
bloc:la source
N'utilisez pas de pom parent
Cela peut sembler extrême, mais de la même manière «l'enfer de l'héritage» est une raison pour laquelle certaines personnes tournent le dos à la programmation orientée objet (ou préfèrent la composition à l'héritage ), supprimez le
<parent>
bloc problématique et copiez et collez tout<dependencies>
ce dont vous avez besoin (si votre équipe vous donne cette liberté).L'hypothèse selon laquelle le fractionnement des poms en un parent et un enfant pour "réutiliser" et "éviter la redondance" doit être ignorée et vous devez d'abord servir vos besoins immédiats (le remède est pire que la maladie). En outre, la redondance a ses avantages - à savoir l'indépendance des changements externes (c'est-à-dire la stabilité).
C'est plus facile qu'il n'y paraît si vous générez le pom effectif (eclipse le fournit mais vous pouvez le générer à partir de la ligne de commande avec
mvn help:effective
).Exemple
Je veux utiliser
logback
comme liaison slf4j, mais mon pom parent inclut lalog4j
dépendance. Je ne veux pas aller et avoir à pousser la dépendance des autres enfants à log4j dans leurs proprespom.xml
fichiers pour que le mien ne soit pas obstrué.la source
Redéfinissez la dépendance (dans le pom enfant) avec le
scope
système pointant vers un pot vide:Le jar ne peut contenir qu'un seul fichier vide:
la source
notepad empty.class
ensuitejar cvf empty.jar empty.class
pour générer un pot vide.Avez-vous essayé de déclarer explicitement la version de mail.jar souhaitée? La résolution des dépendances de Maven doit l'utiliser pour la résolution des dépendances sur toutes les autres versions.
la source
Le mieux est de rendre les dépendances dont vous ne voulez pas toujours hériter de manière intransitive.
Vous pouvez le faire en les marquant dans le pom parent avec la portée fournie.
Si vous souhaitez toujours que le parent gère les versions de ces deps, vous pouvez utiliser la
<dependencyManagement>
balise pour configurer les versions souhaitées sans les hériter explicitement, ni transmettre cet héritage aux enfants.la source
Lorsque vous appelez un package mais que vous ne voulez pas certaines de ses dépendances, vous pouvez faire une chose comme celle-ci (dans ce cas, je ne voulais pas que l'ancien log4j soit ajouté car j'avais besoin d'utiliser le plus récent):
Cela fonctionne pour moi ... mais je suis assez nouveau sur java / maven donc ce n'est peut-être pas optimal.
la source
J'avais vraiment besoin de faire ce sale truc ... Voici comment
J'ai redéfini ces dépendances avec une portée
test
. La portéeprovided
n'a pas fonctionné pour moi.Nous utilisons le plugin Spring Boot pour créer un gros pot. Nous avons un module commun qui définit des bibliothèques communes, par exemple Springfox swagger-2. Mon super-service doit avoir des parents communs (il ne veut pas le faire, mais les règles de l'entreprise s'imposent!)
Donc, mes parents ou mes communs ont du pom.
Et mon pom super-service .
C'est la taille de l'artefact gras final
Cette réponse mérite également d'être mentionnée - je voulais le faire, mais je suis paresseux ... https://stackoverflow.com/a/48103554/4587961
la source
Nous pouvons ajouter le parent pom en tant que dépendance avec le type pom et faire une exclusion à ce sujet. Parce que de toute façon le pom parent est téléchargé. Cela a fonctionné pour moi
la source