2012-10-21 7 views
5

W poniższym przykładzie zależności Maven zależność slf4j chce pobrać log4j 1.2.17, a jawna zależność log4j chce pobrać 1.2.15. Maven rozwiązuje log4j do wersji 1.2.15, jednak nie ma ostrzeżeń, że Maven wypisuje, że sl4j chce późniejszej wersji log4j.Jak zmusić programistę do ostrzeżenia o niedopasowaniu wersji zależnej?

Jak mogę zmusić Mavena do ostrzeżenia o takich typach konfliktów, zamiast po cichu pobrać wersję 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> 

Odpowiedz

9

W skrócie, do obsługi tego należy użyć Maven-enforcer-plugin.

Byłbyś wystarczy skonfigurować wtyczkę Enforcer jak

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

Bardziej szczegółowo, jak powiedział w documentation page, że coś takiego ma transative zależnościach niedopasowanie:

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

będzie działać "bezgłośnie" bez reguły egzekwowania, ale z ustawioną regułą nie powiedzie się wykonanie z

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 

więc, kiedy użytkownik otrzymuje komunikat o błędzie o nieudanej budowie, ona może go naprawić, wykonując wykluczenie, jak

<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

to działało bardzo dobrze, dzięki. – ams