2012-10-21 11 views
5

Nell'esempio delle dipendenze Maven di seguito, la dipendenza slf4j desidera eseguire il pull in log4j 1.2.17 e la dipendenza esplicita log4j vuole eseguire il pull in 1.2.15. Maven risolve log4j alla versione 1.2.15 tuttavia, non ci sono avvisi che Maven stampi che sl4j vuole una versione successiva di log4j.Come convincere Maven ad avvertire in merito alla mancata corrispondenza della versione di dipendenza transativa?

Come posso avvisare Maven di questi tipi di conflitti, piuttosto che prendere semplicemente la versione 1.2.15 ?

<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-log4j12</artifactId> 
    <version>1.7.2</version> 
</dependency> 
<dependency> 
    <groupId>log4j</groupId> 
    <artifactId>log4j</artifactId> 
    <version>1.2.15</version> 
</dependency> 

risposta

9

In breve, è necessario utilizzare Maven-enforcer-plugin per gestirlo.

si era appena necessario configurare il plugin enforcer come

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

Più in dettaglio, come detto nel documentation page, qualcosa di simile che ha un transative mancata corrispondenza di dipendenza:

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

silenziosamente "funzionerà" senza la regola enforcer, ma con la regola impostata, fallirà la build con

Dependency convergence error for org.slf4j:slf4j-api1.6.1 paths to dependency are: 

[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 

così, quando l'utente riceve il messaggio di errore circa la generazione non riuscita, si può risolvere il problema facendo un'esclusione, come

<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> 
    <exclusions> 
    <exclusion> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
    </exclusion> 
    </exclusions> 
</dependency> 
+0

questo ha funzionato molto bene, grazie. – ams

Problemi correlati