2011-01-17 8 views
62

Sto cercando di trovare un modo "generico" di escludere una dipendenza transitiva dall'essere inclusa senza doverla escludere da tutte le dipendenze che dipendono da essa. Ad esempio, se voglio escludere slf4j, faccio la seguente:Esiste un modo per escludere una dipendenza Maven a livello globale?

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

Ciò è in parte di ripulire il file POM, in parte per evitare problemi in futuro con le persone aggiungendo le dipendenze che dipendono da che la dipendenza esclusa - e dimenticando di escluderlo.

C'è un modo?

+2

non risolve il problema, ma Maven-enforcer-plugin ha un [dipendenze vietato caratteristica] (https://maven.apache.org/ enforcer/enforcer-rules/bannedDependencies.html) che fallirà la compilazione se le dipendenze indesiderate si intrufoleranno. Devi comunque escluderle manualmente, però: -/ – dnault

+0

Una risposta alternativa è disponibile qui: http://stackoverflow.com/a/39979760/363573 – Stephan

risposta

49

Questo aiuto? http://jlorenzen.blogspot.com/2009/06/maven-global-excludes.html

"Supponendo che voglio escludere Avalon-quadro dal mio WAR, vorrei aggiungere quanto segue per i miei progetti POM con una portata di condizione. Questo funziona in tutte le dipendenze transitive e consente di specificare una volta.

<dependencies> 
    <dependency> 
     <artifactId>avalon-framework</artifactId> 
     <groupId>avalon-framework</groupId> 
     <version>4.1.3</version> 
     <scope>provided</scope> 
    </dependency> 
</dependencies> 

Questo funziona anche quando lo si specifica nel POM padre, il che impedirebbe ai progetti di dichiararlo in tutte le POM figlio. "

+1

Ha fatto il trucco, perfetto! –

+36

E 'ancora solo un trucco parziale - la dipendenza non finirà all'interno del manufatto build ma è ancora disponibile durante i test. –

+0

@TuukkaMustonen Che dire dell'ambito 'runtime' anziché dell'ambito' provided'? – Stephan

14

ho creato un barattolo vuoto e ha creato questa dipendenza:

<dependency> 
    <groupId>commons-logging</groupId> 
    <artifactId>commons-logging</artifactId> 
    <scope>system</scope> 
    <systemPath>${basedir}/src/lib/empty.jar</systemPath> 
    <version>0</version> 
</dependency> 

Non è perfetto, perché da ora in poi si dispone di un barattolo vuoto nel vostro percorso di compilazione/test. Ma questo è solo cosmetico.

3

Come promemoria, ecco la risposta da Maven documentazione ufficiale:

Perché esclusioni sono fatte su una base per-dipendenza, piuttosto che a livello POM

Questo è principalmente fatto per essere sicuro che il grafico delle dipendenze sia prevedibile e per mantenere gli effetti dell'ereditarietà dall'escludere una dipendenza che non dovrebbe essere esclusa. Se si arriva al metodo di ultima istanza e si deve introdurre un'esclusione, si dovrebbe essere assolutamente certi quale delle sue dipendenze sta portando quella dipendenza transitoria indesiderata.

Se si vuole fare una build più robusto, una gamma versione può essere utilizzato. Ciò garantirebbe che nessuna versione più recente della dipendenza possa interferire con il progetto.

<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-api</artifactId> 
    <version>[1.4.2,)</version> 
    <scope>provided</scope> 
</dependency> 

Qualsiasi versione slf4j-api> = 1.4.2 saranno considerati come offerto (fornito) in fase di esecuzione, sia dal JDK stesso o un contenitore.

Riferimenti

2

Per espandere il dnault's comment:

si può usare il Maven Enforcer plugin's Banned Dependencies rule per garantire le dipendenze sono esclusi. Uno deve ancora escluderli manualmente, ma la compilazione fallirà se qualcuno aggiungerà la dipendenza altrove per sbaglio.

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

Inoltre v'è una richiesta di funzionalità aperta: MNG-1977 Global dependency exclusions