2009-05-03 9 views
25

Il mio progetto include un file jar perché è elencato come una dipendenza transitiva.Maven: rimuovi una singola dipendenza transitiva

Tuttavia, ho verificato non solo che non ne ho bisogno ma causa problemi perché una classe all'interno dei file jar ombreggia una classe di cui ho bisogno in un altro file jar.

Come escludere un singolo file jar dalle mie dipendenze transitive?

risposta

30

È possibile escludere una dipendenza nel seguente modo:

 <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

È possibile farlo escludendo esplicitamente l'artefatto problematico. Prendere la dipendenza che comprende il problema e segnare è da escludere:

Dal 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

Il modo corretto è usare il meccanismo delle esclusioni, tuttavia a volte potresti preferire usare il seguente trucco per evitare di aggiungere un gran numero di esclusioni quando molti artefatti hanno la stessa dipendenza transitiva che vuoi ignorare. Piuttosto che specificare un'esclusione, si definisce una dipendenza aggiuntiva con un ambito di "fornito". Questo dice a Maven che si prenderà cura manualmente di fornire questo artefatto in fase di runtime e quindi non sarà pacchettizzato. Per esempio:

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

Effetto collaterale: è necessario specificare una versione del manufatto-to-be-ignorato, e la sua POM saranno recuperati a l'accumulo di tempo; questo non è il caso delle esclusioni regolari. Questo potrebbe essere un problema per te se esegui il tuo repository Maven privato dietro un firewall.

+0

Ho cercato di escludere servlet-api da una dipendenza jar dal metodo ole e che non ha funzionato per me, ma ho provato questo metodo e ha fatto il trucco. Grazie. – Aaron

+0

questo ha funzionato per me quando ho dovuto escludere una dipendenza basata su un . Grazie! –

+0

È anche possibile utilizzare l'ambito _system_, se la dipendenza è inclusa in JRE. Ad esempio con jaxb-api 2.0 e JRE 6. Vedere [Dipendenze del sistema Maven] (http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#System_Dependencies) –

Problemi correlati