這是一個在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在執行過程中可達?
沒有違法意圖,但聲明依賴於slf4j-api,然後 (不包括slf4j-api)是錯誤的。以下語句也是 不正確。 「讓我們確保slf4j-api確實只加載了一次 ,就像我們預計我們將排除/排除部分 添加到gmaven運行時依賴關係一樣。」當依賴者聲明不同的 版本的工件時,例如slf4j-api,Maven不會在類路徑上多次放置 slf4j-api。即使Maven沒有(其中不包含 ),slf4j-api也不會被加載多次。請 編輯您的問題,以免誤導未來的讀者。 – Ceki 2012-08-03 06:46:50
Ceki,即使這將是冒犯,它會教我一些東西))))事實是slf4j-api被多次加載,因此當我試圖部署爲tomcat的戰爭時創建衝突。一個slf4j在logblack中,另一個在依賴於gmaven-runtime的依賴中。如果我錯過了某些東西,如果你將它變得更加清晰,那將是非常友善的,因爲所有這些依賴解決方案都不是我的專家。 – shabunc 2012-08-03 08:10:23
如果您使用的是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