2009-05-03 18 views
25

Mi proyecto incluye un archivo jar porque está listado como una dependencia transitiva.Maven: eliminar una sola dependencia transitiva

Sin embargo, he verificado no solo que no lo necesito, sino que causa problemas porque una clase dentro de los archivos jar sombrea una clase que necesito en otro archivo jar.

¿Cómo se omite un solo archivo jar de mis dependencias transitivas?

Respuesta

30

Puede excluir una dependencia de la siguiente manera:

 <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

Puede hacer esto excluyendo explícitamente el artefacto problemático. Tome la dependencia que incluye el problema y se marca para ser excluidos:

Desde el experto 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 forma correcta es usar el mecanismo de exclusiones, sin embargo, a veces puede preferir utilizar el siguiente hack para evitar agregar un gran número de exclusiones cuando muchos artefactos tienen la misma dependencia transitiva que desea ignorar. En lugar de especificar una exclusión, define una dependencia adicional con un alcance de "proporcionado". Esto le dice a Maven que se encargará manualmente de proporcionar este artefacto en tiempo de ejecución y por lo tanto no se empacará. Por ejemplo:

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

Efecto secundario: Debe especificar una versión del artefacto-a-ser-ignorados, y su POM se recuperarán durante la acumulación de tiempo; este no es el caso con exclusiones regulares. Esto podría ser un problema para usted si ejecuta su repositorio privado Maven detrás de un firewall.

+0

He intentado excluir servlet-api de una dependencia de jar mediante el método ole y eso no funcionó, pero probé este método y lo resolvió. Gracias. – Aaron

+0

esto funcionó para mí cuando tuve que excluir una dependencia basada en . ¡Gracias! –

+0

También podría usar _system_ scope, si su dependencia está incluida en el JRE. Por ejemplo, con jaxb-api 2.0 y JRE 6. Ver [Dependencias del sistema Maven] (http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#System_Dependencies) –

Cuestiones relacionadas