2012-01-19 138 views
19

我有一個獨立使用兩個依賴關係的項目:BoneCP和Hibernate。但是由於SLF4J及其版本衝突,它不起作用,因爲BoneCP需要SLF4J 1.5,而Hibernate需要SLF4j 1.6。如你所知,在你的pom.xml中重要的兩個不同版本的相同依賴是不可能的。那麼我能做些什麼來解決這個驚人的SLF4J副作用?Maven + SLF4J:使用兩個不同的依賴關係需要兩個不同的SLF4J版本時版本衝突

我得到的錯誤是臭名昭著的:

SLF4J: The requested version 1.5.10 by your slf4j binding is not compatible with [1.6] 
SLF4J: See http://www.slf4j.org/codes.html#version_mismatch for further details. 

我需要補充這一點,但是有兩個不同的版本相同的依賴是不允許的:

<dependency> 
<groupId>org.slf4j</groupId> 
<artifactId>slf4j-log4j12</artifactId> 
<version>1.5.10</version> 
<scope>provided</scope> 
</dependency> 

<dependency> 
<groupId>org.slf4j</groupId> 
<artifactId>slf4j-log4j12</artifactId> 
<version>1.6.2</version> 
<scope>provided</scope> 
</dependency> 

Maven的依賴關係樹:

[INFO] [dependency:tree {execution: default-cli}] 
[INFO] org.mentawai:menta:war:1.0.5-SNAPSHOT 
[INFO] +- javax.servlet.jsp:jsp-api:jar:2.0:provided 
[INFO] +- javax.servlet:servlet-api:jar:2.5:provided 
[INFO] +- javax.activation:activation:jar:1.1:compile 
[INFO] +- javax.mail:mail:jar:1.4:compile 
[INFO] +- javax.persistence:persistence-api:jar:1.0:compile 
[INFO] +- org.slf4j:slf4j-log4j12:jar:1.5.10:compile 
[INFO] | +- org.slf4j:slf4j-api:jar:1.5.10:compile 
[INFO] | \- log4j:log4j:jar:1.2.14:compile 
[INFO] +- org.hibernate:hibernate-core:jar:3.6.7.Final:compile 
[INFO] | +- antlr:antlr:jar:2.7.6:compile 
[INFO] | +- commons-collections:commons-collections:jar:3.1:compile 
[INFO] | +- dom4j:dom4j:jar:1.6.1:compile 
[INFO] | +- org.hibernate:hibernate-commons-annotations:jar:3.2.0.Final:compile 
[INFO] | +- org.hibernate.javax.persistence:hibernate-jpa-2.0-api:jar:1.0.1.Final:compile 
[INFO] | \- javax.transaction:jta:jar:1.1:compile 
[INFO] +- javassist:javassist:jar:3.12.1.GA:compile 
[INFO] +- junit:junit:jar:4.8.1:test 
[INFO] +- c3p0:c3p0:jar:0.9.1.2:compile 
[INFO] +- com.h2database:h2:jar:1.2.138:compile 
[INFO] +- mysql:mysql-connector-java:jar:5.1.13:compile 
[INFO] +- me.soliveirajr:mentawai:jar:2.3.3-SNAPSHOT:compile 
[INFO] | +- net.sf.json-lib:json-lib:jar:jdk15:2.3:compile 
[INFO] | | +- commons-beanutils:commons-beanutils:jar:1.8.0:compile 
[INFO] | | +- commons-logging:commons-logging:jar:1.1.1:compile 
[INFO] | | \- net.sf.ezmorph:ezmorph:jar:1.0.6:compile 
[INFO] | +- org.jdom:jdom:jar:1.1:compile 
[INFO] | +- com.thoughtworks.xstream:xstream:jar:1.3.1:compile 
[INFO] | | \- xpp3:xpp3_min:jar:1.1.4c:compile 
[INFO] | +- org.ajaxtags:ajaxtags:jar:1.2-beta3:compile 
[INFO] | | +- javax.servlet:jstl:jar:1.0.6:compile 
[INFO] | | +- taglibs:standard:jar:1.0.6:compile 
[INFO] | | \- net.htmlparser:jericho-html:jar:2.1:compile 
[INFO] | +- jgroups:jgroups-all:jar:2.2.9.1:compile 
[INFO] | +- me.soliveirajr:menta-container:jar:0.9.8:compile 
[INFO] | +- me.soliveirajr:menta-bean:jar:1.1.1:compile 
[INFO] | +- me.soliveirajr:menta-regex:jar:0.9.5:compile 
[INFO] | +- org.beanshell:bsh:jar:2.0b4:compile 
[INFO] | +- com.jolbox:bonecp:jar:0.7.1.RELEASE:compile 
[INFO] | | \- com.google.guava:guava:jar:r08:compile 
[INFO] | +- velocity:velocity-dep:jar:1.4:compile 
[INFO] | +- commons-fileupload:commons-fileupload:jar:1.2.2:compile 
[INFO] | +- commons-io:commons-io:jar:1.3.2:compile 
[INFO] | +- net.tanesha.recaptcha4j:recaptcha4j:jar:0.0.7:compile 
[INFO] | \- commons-dbcp:commons-dbcp:jar:1.4:compile 
[INFO] |  \- commons-pool:commons-pool:jar:1.5.4:compile 
[INFO] +- commons-lang:commons-lang:jar:2.5:compile 
[INFO] \- asm:asm:jar:3.2:compile 
+0

請添加您收到的錯誤。此外,不應該因爲其他依賴項使用它而將SLF4J添加到POM中 - 如果_you_直接使用它,則只需添加它。Maven負責傳遞依賴關係,我懷疑它會拉到1.6,而BoneCP不會不高興。 – SingleShot

+0

添加錯誤。我相信我必須添加一個SLF4J的實現。所以問題是:Hibernate需要1.6實現。 BoneCP需要1.5。這是衝突! – chrisapotek

回答

28

在錯誤消息中提供的鏈接, 「http://www.slf4j.org/codes.html#version_mismatch」,規定:

一種SLF4J結合指定的僞影,例如用於結合SLF4J SLF4J-jdk14.jar或 SLF4J-log4j12.jar到底層日誌記錄 框架,比如java.util.logging或log4j。混合混合不同 版本的slf4j-api.jar和SLF4J綁定可能會導致問題。例如,如果你使用slf4j-api-1.6.6.jar,那麼你應該也使用slf4j-simple-1.6.6.jar,使用slf4j-simple-1.5.5.jar將不會 工作。

備註從客戶的角度來看,所有版本的slf4j-api都是 兼容。用slf4j-api-N.jar編譯的客戶端代碼將運行 ,對於任何N和M,slf4j-api-M.jar都可以完美地運行。只需要 確保您的綁定版本匹配 slf4j-api 。罐。您不必擔心項目中給定的依賴關係使用的slf4j-api.jar的版本。你可以在 中始終使用任何版本的slf4j-api.jar,並且只要版本號爲 的slf4j-api.jar與它的綁定匹配,你應該沒問題。

所有你需要的是在你的pom.xml中聲明一個SLF4J版本的slf4j-log4j12的依賴關係。我會建議1.6.6這是最新的。這將通過Maven的傳遞規則將相同版本的slf4j-api引入到您的項目中。

所以,只需在您的pom.xml文件中聲明以下內容。

<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-log4j12</artifactId> 
    <version>1.7.5</version> 
</dependency> 

我假設你實際上並不需要在提供的範圍內聲明slf4j-api和slf4j-log4j12。

+12

僅供參考此回覆來自SLF4J的作者。 – SingleShot

4

只是排除1.5.10版本的SLF4J

<dependency> 
     <groupId>...</groupId> 
     <artifactId>BoneCP</artifactId> 
     <version>...</version> 
     <exclusions> 
     <exclusion> <!-- declare the exclusion here --> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-log4j12</artifactId> 
     <version>1.5.10</version> 
     </exclusion> 
     </exclusions> 
    </dependency> 
+1

+1提到排除。 @chrisapotek - 你可能想要從BoneCP **和** Hibernate中實際排除SLF4J,然後爲slf4j-api和slf4j-simple手動添加依賴到你的pom。這應該擺脫依賴衝突的好處。 – Perception

+0

這裏有些東西被誤解:BoneCP綁定(需要)1.5。它綁定到API,而不是上面試圖排除的實現。我需要爲BoneCP包含額外的實現。我無法切換BoneCP使用的API版本。檢查在問題中編輯的mvn依賴項。 – chrisapotek

0

我得到了同樣的錯誤。基本上,要小心在classpath中有多個slf4j jar版本。

相關問題