2009-05-03 6 views
25

Mon projet inclut un fichier jar car il est répertorié en tant que dépendance transitive.Maven: supprime une seule dépendance transitive

Cependant, j'ai vérifié non seulement que je n'en ai pas besoin mais cela cause des problèmes car une classe dans les fichiers jar ombrage une classe dont j'ai besoin dans un autre fichier jar. Comment puis-je supprimer un seul fichier jar de mes dépendances transitives?

Répondre

30

Vous pouvez exclure une dépendance de la manière suivante:

 <dependency> 
       <groupId>org.springframework</groupId> 
       <artifactId>spring</artifactId> 
       <version>2.5.6</version> 
       <exclusions> 
         <exclusion> 
           <groupId>commons-logging</groupId> 
           <artifactId>commons-logging</artifactId> 
         </exclusion> 
       </exclusions> 
     </dependency> 
3

Vous pouvez le faire en excluant explicitement l'artefact problématique. Prendre la dépendance qui comprend le problème et le marquer à exclure:

De l'maven website:

<dependency> 
    <groupId>group-a</groupId> 
    <artifactId>artifact-a</artifactId> 
    <version>1.0</version> 
    <exclusions> 
    <exclusion> 
     <groupId>group-c</groupId> 
     <artifactId>excluded-artifact</artifactId> 
    </exclusion> 
    </exclusions> 
</dependency> 
15

La bonne façon est d'utiliser le mécanisme des exclusions, mais parfois vous préférerez peut-être utiliser le hack suivant pour éviter d'ajouter un grand nombre d'exclusions lorsque de nombreux artefacts ont la même dépendance transitive que vous souhaitez ignorer. Plutôt que de spécifier une exclusion, vous définissez une dépendance supplémentaire avec une portée de "fournie". Cela indique à Maven que vous prendrez manuellement soin de fournir cet artefact lors de l'exécution et qu'il ne sera donc pas empaqueté. Par exemple:

<dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring</artifactId> 
      <version>2.5.6</version> 
    </dependency> 
    <dependency> 
      <groupId>commons-logging</groupId> 
      <artifactId>commons-logging</artifactId> 
      <version>1.1.1</version> 
      <scope>provided</scope> 
    </dependency> 

Effet secondaire: vous devez spécifier une version de l'artefact-être à ignoré, et son POM seront récupérés au moment de la construction; ce n'est pas le cas avec les exclusions régulières. Cela peut être un problème pour vous si vous exécutez votre référentiel Maven privé derrière un pare-feu.

+0

J'ai essayé d'exclure servlet-api d'une dépendance de pot par la méthode ole et cela n'a pas fonctionné pour moi mais a essayé cette méthode et il a fait l'affaire. Merci. – Aaron

+0

cela a fonctionné pour moi quand j'ai dû exclure une dépendance basée sur un . Merci! –

+0

Vous pouvez également utiliser la portée _system_ si votre dépendance est incluse dans le JRE. Par exemple avec jaxb-api 2.0 et JRE 6. Voir [Dépendances du système Maven] (http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#System_Dependencies) –

Questions connexes