2013-02-13 211 views
3

我会用我的真实情况来解释这个问题。Maven 2 - 从传递依赖版本定义依赖版本

我使用logback 1.0.1进行日志记录,它包含SLF4J 1.6.4作为依赖项。我还为传统日志记录API(java.util.logging,log4j和commons-logging)使用SLF4J API网桥,这些网桥不是显式依赖关系。这些也必须(最好)是版本1.6.4。

试图尽可能使我的pom.xml尽可能没有错误,我想强制这些API网桥与SLF4J版本相同。我知道的唯一方法是使用版本1.6.4在我的pom.xml中手动将它们定义为依赖项。如果我更新了logback并且引发了所需的SLF4J版本,我需要记住将桥接API更改为正确的版本。

我可以以某种方式将传统API的版本挂钩到传递依赖关系SLF4J的版本吗?

当前的pom.xml:

<properties> 
    <org.slf4j.version>1.6.4</org.slf4j.version> 
</properties> 

<dependencies> 
    <dependency> 
     <groupId>ch.qos.logback</groupId> 
     <artifactId>logback-classic</artifactId> 
     <version>1.0.1</version> 
     <!-- requires SLF4J 1.6.4 --> 
    </dependency> 
    <!-- ... --> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>log4j-over-slf4j</artifactId> 
     <version>${org.slf4j.version}</version> 
     <!-- here, how to bind this version value to SLF4J's version? --> 
     <scope>runtime</scope> 
    </dependency> 
    <!-- the other two bridge API's go here --> 
</dependencies> 

回答

2

不是在一个非常美丽的方式:/

有maven的执法插件:http://maven.apache.org/enforcer/enforcer-rules/

这样你就可以禁止传递依赖,并包括你想要的版本:http://maven.apache.org/enforcer/enforcer-rules/bannedDependencies.html

如果你使用好的版本属性,你不需要在执行者中乱搞插件版本。

+0

我看着执行者,但它不是我真正需要的东西。如果我简单地在我的pom中定义SLF4J,我会得到相同的结果。它可以正常工作,但是不会通过logback升级“自动”,我还需要更改SLF4J版本。功能,但不是一个美丽的方式...... ;-) – user1183250 2013-02-14 11:18:16

+0

jepp!事情是这并不妨碍人们通过直接添加它们来改变传递依赖的版本。如果你禁止那些你确定没有人能够做到这一点。但这可能不是问题:) – wemu 2013-02-14 12:17:15

1

只是不直接依赖slf4j在您的最高等级pom中。

+0

我需要桥接API,我可以直接或不依赖SLF4J,但版本不匹配的可能性仍然存在,因为我需要手动定义两个版本。如果绑定这两个版本/库目前还不能完成,因为目前为止没有人编写这样的代码,所以我必须应付它。 – user1183250 2013-02-14 11:21:29

2

Dependency Convergence可能会帮助你。谢谢@wemu!我有same? problem

您可以克隆https://gist.github.com/f35db1ac6dc8b6f45393.git

<dependencies> 
    <dependency> 
    <groupId>ch.qos.logback</groupId> 
    <artifactId>logback-classic</artifactId> 
    <version>1.1.3</version> 
    <scope>runtime</scope> <!-- depends on slf4j-api:1.7.7 --> 
    </dependency> 
    <dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>log4j-over-slf4j</artifactId> 
    <version>${unified.slf4j-api.version}</version> 
    <scope>runtime</scope> 
    </dependency> 
    <dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-api</artifactId> 
    <version>${unified.slf4j-api.version}</version> 
    </dependency> 
</dependencies> 
<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <unified.slf4j-api.version>1.7.7</unified.slf4j-api.version> 
</properties> 
<build> 
    <plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-enforcer-plugin</artifactId> 
     <version>1.4.1</version> 
     <executions> 
     <execution> 
      <id>enforce</id> 
      <configuration> 
      <rules> 
       <dependencyConvergence/> 
      </rules> 
      </configuration> 
      <goals> 
      <goal>enforce</goal> 
      </goals> 
     </execution> 
     </executions> 
    </plugin> 
    </plugins> 
</build> 

此时,事情只是工作。

$ mvn -Dverbose=true dependency:tree verify 
... 
[INFO] test:enforcer-dependency-convergence-test:jar:0.1-SNAPSHOT 
[INFO] +- ch.qos.logback:logback-classic:jar:1.1.3:runtime 
[INFO] | +- ch.qos.logback:logback-core:jar:1.1.3:runtime 
[INFO] | \- (org.slf4j:slf4j-api:jar:1.7.7:runtime - omitted for duplicate) 
[INFO] +- org.slf4j:log4j-over-slf4j:jar:1.7.7:runtime 
[INFO] | \- (org.slf4j:slf4j-api:jar:1.7.7:runtime - omitted for duplicate) 
[INFO] \- org.slf4j:slf4j-api:jar:1.7.7:compile 
[INFO] 
[INFO] --- maven-enforcer-plugin:1.4.1:enforce (default) @ enforcer-dependency-convergence-test --- 
[INFO] 
... 
[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD SUCCESS 
[INFO] ------------------------------------------------------------------------ 
... 

$ 

现在让我们改变slf4j-api的版本。

$ mvn -Dunified.slf4j-api.version=1.7.13 -Dverbose=true dependency:tree verify 
... 
[INFO] test:enforcer-dependency-convergence-test:jar:0.1-SNAPSHOT 
[INFO] test:enforcer-dependency-convergence-test:jar:0.1-SNAPSHOT 
[INFO] +- ch.qos.logback:logback-classic:jar:1.1.3:runtime 
[INFO] | +- ch.qos.logback:logback-core:jar:1.1.3:runtime 
[INFO] | \- (org.slf4j:slf4j-api:jar:1.7.7:runtime - omitted for conflict with 1.7.13) 
[INFO] +- org.slf4j:log4j-over-slf4j:jar:1.7.13:runtime 
[INFO] | \- (org.slf4j:slf4j-api:jar:1.7.13:runtime - omitted for conflict with 1.7.7) 
[INFO] \- org.slf4j:slf4j-api:jar:1.7.13:compile 
[INFO] 
[INFO] --- maven-enforcer-plugin:1.4.1:enforce (default) @ enforcer-dependency-convergence-test --- 
[WARNING] 
Dependency convergence error for org.slf4j:slf4j-api:1.7.7 paths to dependency are: 
+-test:enforcer-dependency-convergence-test:0.1-SNAPSHOT 
    +-ch.qos.logback:logback-classic:1.1.3 
    +-org.slf4j:slf4j-api:1.7.7 
and 
+-test:enforcer-dependency-convergence-test:0.1-SNAPSHOT 
    +-org.slf4j:log4j-over-slf4j:1.7.13 
    +-org.slf4j:slf4j-api:1.7.13 
and 
+-test:enforcer-dependency-convergence-test:0.1-SNAPSHOT 
    +-org.slf4j:slf4j-api:1.7.13 

[WARNING] Rule 0: org.apache.maven.plugins.enforcer.DependencyConvergence failed with message: 
Failed while enforcing releasability the error(s) are [ 
Dependency convergence error for org.slf4j:slf4j-api:1.7.7 paths to dependency are: 
+-test:enforcer-dependency-convergence-test:0.1-SNAPSHOT 
    +-ch.qos.logback:logback-classic:1.1.3 
    +-org.slf4j:slf4j-api:1.7.7 
and 
+-test:enforcer-dependency-convergence-test:0.1-SNAPSHOT 
    +-org.slf4j:log4j-over-slf4j:1.7.13 
    +-org.slf4j:slf4j-api:1.7.13 
and 
+-test:enforcer-dependency-convergence-test:0.1-SNAPSHOT 
    +-org.slf4j:slf4j-api:1.7.13 
] 
[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD FAILURE 
[INFO] ------------------------------------------------------------------------ 
... 

$