2012-08-01 181 views
13

這是一個在SE網站上聽起來像一堆similar questions的問題,所以我應該非常詳細地說明問題。所以,這裏是項目的最小pom.xml解決maven項目中的多個SLF4J綁定問題

<dependencies> 
    <dependency> 
     <groupId>ch.qos.logback</groupId> 
     <artifactId>logback-classic</artifactId> 
     <version>1.0.6</version> 
    </dependency> 

    <dependency> 
     <groupId>org.codehaus.gmaven.runtime</groupId> 
     <artifactId>gmaven-runtime-1.7</artifactId> 
     <version>1.3</version> 
    </dependency> 

</dependencies> 
<build> 
    <plugins> 
     <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>exec-maven-plugin</artifactId> 
      <version>1.2.1</version> 
      <configuration> 
       <mainClass>org.shabunc.App</mainClass> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

下面是行家所產生的依賴關係樹。

mvn dependency:tree -Dverbose -Dincludes=org.slf4j

[INFO] [dependency:tree {execution: default-cli}] 
[INFO] org.shabunc:logdebug:jar:1.0-SNAPSHOT 
[INFO] \- ch.qos.logback:logback-classic:jar:1.0.6:compile 
[INFO] \- org.slf4j:slf4j-api:jar:1.6.5:compile 

現在,讓我們刪除排除,並再次檢查依賴性。我們會得到:

[INFO] org.shabunc:logdebug:jar:1.0-SNAPSHOT 
[INFO] +- ch.qos.logback:logback-classic:jar:1.0.6:compile 
[INFO] | \- org.slf4j:slf4j-api:jar:1.6.5:compile 
[INFO] \- org.codehaus.gmaven.runtime:gmaven-runtime-1.7:jar:1.3:compile 
[INFO] +- (org.slf4j:slf4j-api:jar:1.5.10:compile - omitted for conflict with 1.6.5) 
[INFO] +- org.codehaus.gmaven.feature:gmaven-feature-support:jar:1.3:compile 
[INFO] | \- (org.slf4j:slf4j-api:jar:1.5.10:compile - omitted for conflict with 1.6.5) 
[INFO] \- org.codehaus.gmaven.runtime:gmaven-runtime-support:jar:1.3:compile 
[INFO]  +- (org.slf4j:slf4j-api:jar:1.5.10:compile - omitted for conflict with 1.6.5) 
[INFO]  \- org.sonatype.gshell:gshell-io:jar:2.0:compile 
[INFO]   \- org.sonatype.gossip:gossip:jar:1.0:compile 
[INFO]    \- (org.slf4j:slf4j-api:jar:1.5.8:compile - omitted for conflict with 1.6.5) 

所以,我們可以看到,一切正常,而衝突的相關性實際上得到排除。但事實是,即使依賴排除我仍然可以在編譯和調用mvn exec:java以下消息:

SLF4J: Class path contains multiple SLF4J bindings. 
SLF4J: Found binding in [jar:file:/home/shabunc/.m2/repository/ch/qos/logback/logback-classic/1.0.6/logback-classic-1.0.6.jar!/org/slf4j/impl/StaticLoggerBinder.class] 
SLF4J: Found binding in [jar:file:/home/shabunc/.m2/repository/org/sonatype/gossip/gossip/1.0/gossip-1.0.jar!/org/slf4j/impl/StaticLoggerBinder.class] 

的問題是:爲什麼我仍然看到此警告,究竟應該怎樣做才能使只有一個版本slf4j在執行過程中可達?

+1

沒有違法意圖,但聲明依賴於slf4j-api,然後 (不包括slf4j-api)是錯誤的。以下語句也是 不正確。 「讓我們確保slf4j-api確實只加載了一次 ,就像我們預計我們將排除/排除部分 添加到gmaven運行時依賴關係一樣。」當依賴者聲明不同的 版本的工件時,例如slf4j-api,Maven不會在類路徑上多次放置 slf4j-api。即使Maven沒有(其中不包含 ),slf4j-api也不會被加載多次。請 編輯您的問題,以免誤導未來的讀者。 – Ceki 2012-08-03 06:46:50

+0

Ceki,即使這將是冒犯,它會教我一些東西))))事實是slf4j-api被多次加載,因此當我試圖部署爲tomcat的戰爭時創建衝突。一個slf4j在logblack中,另一個在依賴於gmaven-runtime的依賴中。如果我錯過了某些東西,如果你將它變得更加清晰,那將是非常友善的,因爲所有這些依賴解決方案都不是我的專家。 – shabunc 2012-08-03 08:10:23

+0

如果您使用的是Maven,則在您的課程路徑中不存在不同版本的slf4j-api。然而,對於不同的slf4j *綁定,例如, slf4j-jdj14.jar,slf4j-log4j.jar或logback-classic.jar同時存在於類路徑中。在你的情況,你有logback-classic-1.0.6.jar gossip-1.0.jar禮物。湯姆安德森已經爲排除「八卦」提供了一個很好的答案。 – Ceki 2012-08-03 08:20:39

回答

18

您的問題沒有得到SLF4J API的兩個副本,它得到兩個不同的SLF4J實現。您需要排除Gossip,而不是API。這意味着類似:

<dependency> 
    <groupId>org.codehaus.gmaven.runtime</groupId> 
    <artifactId>gmaven-runtime-1.7</artifactId> 
    <version>1.3</version> 
    <exclusions> 
     <exclusion> 
     <groupId>org.sonatype.gossip</groupId> 
     <artifactId>gossip</artifactId> 
     </exclusion> 
    </exclusions> 
</dependency> 

的緋聞關係受gshell-io聲明;希望它實際上不需要閒話,它只需要一個SLF4J SLF4J,它以Logback的形式提供。

+0

所以,你的意思是我可以免費排除八卦依賴,沒有任何戲劇性的後果? )))那麼,如果還有更多依賴關係依賴於slf4j,它很快就會變成一場噩夢((( – shabunc 2012-08-01 12:37:19

+1

))讓SLF4J開心的唯一方法是刪除對Logback的依賴,或者排除gshell-io對Gossip的依賴,但是我不能保證這不會產生嚴重後果,我希望它不會 - 對於一個庫直接依賴日誌實現 – 2012-08-01 12:39:03

+0

這個問題是因爲有兩個不同的提供者... gossip jar有一個slf4j實現它.. 所以你要麼應該從你的依賴樹中刪除logback或八卦.. – Byter 2012-08-01 12:41:02

1

我想你需要依賴的範圍玩,看:http://www.mojohaus.org/exec-maven-plugin/java-mojo.html

classpathScope - 定義類路徑的範圍傳遞給插件。根據您的需要設置爲編譯,測試,運行時或系統。

+0

可以,請更具體地說,我仍然沒有得到如何設置classpathScope將有助於解決這個問題。 – shabunc 2012-08-01 12:17:54

3

所有你需要做的就是添加這樣的

compile "org.sonatype.gossip:gossip:1.0" { 
    exclude module:'slf4j-jcl' 
    exclude module:'slf4j-log4j12' 
} 
+0

該問題是由於使用八卦罐的傳遞依賴性引起的。 上面的代碼將排除sloss執行從八卦的依賴。 – Byter 2012-08-01 12:23:13

+2

「這樣的東西」在這裏意味着「這個Gradle代碼的Maven相當於」! – 2012-08-01 12:27:26

+0

@TomAnderson ya ...對不起,我沒有提到:) – Byter 2012-08-01 12:29:40