web-dev-qa-db-fra.com

Existe-t-il un moyen d'exclure une dépendance Maven à l'échelle mondiale?

J'essaie de trouver un moyen "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 des problèmes à l'avenir avec des personnes ajoutant des dépendances qui dépendent de cette dépendance exclue - et oubliant de l'exclure.

Y a-t-il un moyen?

79

Est-ce que cela aide? http://jlorenzen.blogspot.com/2009/06/maven-global-excludes.html

"En supposant que je souhaite exclure avalon-framework de mon WAR, j'ajouterais ce qui suit à mes projets POM avec une portée de fournie. 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 lorsque vous le spécifiez dans le POM parent, ce qui empêcherait les projets de devoir le déclarer dans tous les POM enfants. "

58
Joffer

J'ai créé un pot 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 pot vide dans votre chemin de compilation/test. Mais c'est juste cosmétique.

17
Guus Bloemsma

Pour développer commentaire de dnault :

On peut utiliser la règle des interdictions interdites du plugin Maven Enforcer pour garantir que les dépendances sont exclues. Il faut toujours les exclure manuellement, mais la génération é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 existe également une demande de fonctionnalité ouverte: MNG-1977 Global dependency exclusions

9

Pour rappel, voici la réponse de la documentation officielle de Maven:

Pourquoi les exclusions sont faites par dépendance, plutôt qu'au niveau POM

Ceci est principalement fait pour être sûr que le graphe de dépendance est prévisible et pour empêcher 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 devez mettre une exclusion, vous devez être absolument certain de laquelle de vos dépendances apporte cette dépendance transitive indésirable.

Si l'on veut rendre une construction plus robuste, une gamme de versions peut être utilisée. Cela garantirait qu'aucune version plus récente 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 de slf4j-api> = 1.4.2 sera considérée comme offerte (fournie) au moment de l'exécution, à partir d'un chemin de classe configuré ou d'un conteneur.

Références

6
Stephan