2010-12-22 3 views
17

Я побежал МВН зависимость: дерево для проекта, и я увидел, как выход следующее:Как разбить сборку maven при конфликте зависимости?

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

Это плохое состояние, чтобы быть в, потому что мой проект напрямую зависит от SLF4J 1.6.0 и некоторые библиотеки, которые мы зависим транзитивно зависит от slf4j 1.6.1. Эти две версии являются бинарными, поэтому сборка проходит без каких-либо предупреждений. Есть ли способ заставить Maven быть более строгим в отношении разрешения зависимостей, чтобы я мог настроить новую сборку, которая потерпит неудачу в этом сценарии? В этом случае решением было бы просто обновить нашу зависимость до более новой версии slf4j.

ответ

22

Плагин maven-enforcer имеет конфигурацию dependencyConvergence, которая делает то, что я хочу. Кстати, в примере из документации используется slf4j.

настроить его так:

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

Такое сочетание зависимостей вызовет сбой сборки:

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

При этом, как вход во время компиляции:

[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 
Смежные вопросы