2010-12-22 9 views
17

mi sono imbattuto dipendenza mvn: albero per un progetto e ho visto di uscita come il seguente:Come rompere una build di Maven quando c'è un conflitto di dipendenze?

[INFO] my:project:jar:1.0.0-SNAPSHOT 
[INFO] +- some.other:library:jar:2.0.0:compile 
[INFO] | \- org.slf4j:slf4j-api:jar:1.6.1:compile 
[INFO] +- org.slf4j:slf4j-simple:jar:1.6.0:compile 
[INFO] | \- (org.slf4j:slf4j-api:jar:1.6.0:compile - omitted for conflict with 1.6.1) 

Si tratta di un cattivo stato di essere in quanto il mio progetto dipende direttamente slf4j 1.6.0 e qualche libreria che dipendiamo in transito dipende da slf4j 1.6.1. Queste due versioni sono compatibili con i binari quindi la generazione passa senza avvisi. C'è un modo per convincere Maven a essere più severo sulla sua risoluzione delle dipendenze in modo da poter configurare una nuova build che fallirebbe in questo scenario? In questo caso, la soluzione sarebbe semplicemente aggiornare la nostra dipendenza alla versione più recente di slf4j.

risposta

22

Il plug-in maven-enforcer ha una configurazione dependencyConvergence che fa ciò che voglio. Per coincidenza, l'esempio della documentazione utilizza slf4j.

configurarlo in questo modo:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-enforcer-plugin</artifactId> 
    <version>1.0</version> 
    <executions> 
     <execution> 
      <id>enforce</id> 
      <configuration> 
       <rules> 
        <DependencyConvergence /> 
       </rules> 
      </configuration> 
      <goals> 
       <goal>enforce</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

Questa combinazione di dipendenze causerà un accumulo di fallire:

<dependencies> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-jdk14</artifactId> 
     <version>1.6.1</version> 
    </dependency> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-nop</artifactId> 
     <version>1.6.0</version> 
    </dependency> 
    </dependencies> 

Con questo viene registrato durante la compilazione:

[ERROR] 
Dependency convergence error for org.slf4j:slf4j-api:1.6.1 paths to dependency are: 
+-org.myorg:my-project:1.0.0-SNAPSHOT 
    +-org.slf4j:slf4j-jdk14:1.6.1 
    +-org.slf4j:slf4j-api:1.6.1 
and 
+-org.myorg:my-project:1.0.0-SNAPSHOT 
    +-org.slf4j:slf4j-nop:1.6.0 
    +-org.slf4j:slf4j-api:1.6.0