2013-02-13 257 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] ------------------------------------------------------------------------ 
... 

$