2012-10-21 8 views
5

In den unten aufgeführten Maven-Beispielabhängigkeiten möchte die Slf4j-Abhängigkeit log4j 1.2.17 abrufen, und die explizite log4j-Abhängigkeit möchte 1.2.15 abrufen. Maven löst log4j auf Version 1.2.15 auf, es gibt jedoch keine Warnungen, dass Maven ausgibt, dass sl4j eine spätere Version von log4j möchte.Wie man Maven bekommt, um über nicht übereinstimmende Versionsunterschiede der transitiven Abhängigkeit zu warnen?

Wie kann ich Maven dazu bringen, vor diesen Arten von Konflikten zu warnen, statt einfach die 1.2.15-Version still zu nehmen?

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

Antwort

9

Kurz gesagt, Maven-enforcer-plugin sollte verwendet werden, um dies zu behandeln.

Sie würden brauchen nur die Vollstrecker Plugin wie

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

Im Detail zu konfigurieren, wie in den documentation page gesagt, so etwas wie dies, dass ein transative Abhängigkeitskonflikt hat:

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

wird automatisch ohne die Erzwingenregel "arbeiten", aber mit der Regel eingerichtet, wird es den Build mit

fehlschlagen
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 

so, wenn der Benutzer die Fehlermeldung über den ausgefallenen Build wird, kann sie es beheben, indem Sie einen Ausschluss zu tun, wie

<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

dies sehr gut funktioniert, danke. – ams

Verwandte Themen