Est-il un moyen d'exclure une dépendance Maven à l'échelle mondiale?
j'essaie de trouver une façon" générique " d'exclure une dépendance transitive de l'inclusion sans avoir à l'exclure de toutes les dépendances qui en dépendent. Par exemple, si je veux exclure slf4j, je fais ce qui suit:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-jmx</artifactId>
<version>3.3.2.GA</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>3.4.0.GA</version>
<type>jar</type>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
ceci est en partie pour nettoyer le fichier pom, en partie pour éviter les problèmes à l'avenir avec les gens ajoutant des dépendances qui dépendent de cette dépendance exclue - et oubliant de l'exclure.
est il y a un moyen?
4 réponses
est-ce que ça aide? http://jlorenzen.blogspot.com/2009/06/maven-global-excludes.html
" en supposant que je veux exclure avalon-framework de ma guerre, je voudrais ajouter ce qui suit à mes projets POM avec une portée de fournis. Cela fonctionne à travers toutes les dépendances transitives et vous permet de le spécifier une fois.
<dependencies>
<dependency>
<artifactId>avalon-framework</artifactId>
<groupId>avalon-framework</groupId>
<version>4.1.3</version>
<scope>provided</scope>
</dependency>
</dependencies>
cela fonctionne même en le spécifiant dans le POM parent, ce qui empêcherait les projets d'avoir à déclarez ceci dans tous les noms d'enfants."
j'ai créé un bocal vide et créé cette dépendance:
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<scope>system</scope>
<systemPath>${basedir}/src/lib/empty.jar</systemPath>
<version>0</version>
</dependency>
ce n'est pas parfait car à partir de Maintenant vous avez un bocal vide dans votre chemin de compilation/test. Mais c'est juste cosmétique.
pour développer commentaire de dnault :
on peut utiliser la règle du plugin Maven Enforcer sur les dépendances bannies pour s'assurer que les dépendances sont exclues. On a encore de les exclure manuellement, mais la compilation échouera si quelqu'un ajoute la dépendance ailleurs par erreur.
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-jmx</artifactId>
<version>3.3.2.GA</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>1.4.1</version>
<executions>
<execution>
<goals>
<goal>enforce</goal>
</goals>
<configuration>
<rules>
<bannedDependencies>
<excludes>
<exclude>org.slf4j:slf4j-api</exclude>
</excludes>
</bannedDependencies>
</rules>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
il y a aussi une demande de caractéristique ouverte: MNG - 1977 global dependency exclusions
pour rappel, voici la réponse de la documentation officielle de Maven:
pourquoi les exclusions sont faites sur une base par personne à charge, plutôt qu'au niveau de la POM
ceci est principalement fait pour s'assurer que le graphique de dépendance est prévisible, et pour garder les effets d'héritage d'exclure une dépendance qui ne devrait pas être exclue. Si vous arrivez à la méthode de dernier recours et les mettre dans un l'exclusion, vous devriez être absolument certain laquelle de vos dépendances apporte cette dépendance transitive non désirée.
si l'on veut rendre une construction plus robuste, on peut utiliser une gamme de version . Cela garantirait qu'aucune nouvelle version de la dépendance ne puisse interférer avec le projet.
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>[1.4.2,)</version>
<scope>provided</scope>
</dependency>
toute version slf4j-api > = 1.4.2 sera considérée tel que proposé (fourni) à l'exécution, soit à partir d'un chemin de classe configuré ou d'un conteneur.
Références