2012-01-19 8 views
19

BoneCPとHibernateの両方の依存関係を独立して使用するプロジェクトがあります。しかし、BoneCPはSLF4J 1.5を必要とし、HibernateはSLF4j 1.6が必要なため、SLF4Jとそのバージョンの競合により、動作しません。ご存じのように、pom.xmlには同じ依存関係の2つの異なるバージョンは重要ではありません。だから私はこの驚くべきSLF4J副作用回避策に何ができますか?Maven + SLF4J:2つの異なるSLF4Jバージョンを必要とする2つの異なる依存関係を使用する場合のバージョンの競合

私が手にエラーが悪名高いです:

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. 

私はこれを追加する必要がありますが、2つの異なるバージョンと同じ依存関係が許可されていません。

<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に追加するべきではありません。それは他の依存関係がそれを使用するためです。直接使用する場合は追加するだけです。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に移動します。異なるslake4j-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 .jar。あなたのプロジェクトの特定の依存関係によって使用される 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

FYIこの応答はSLF4Jの作者によるものです。 – SingleShot

4

SLF4Jの1.5.10バージョンを除外してください

<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をexcluseしたいかもしれません。そして、手動であなたのpomにslf4j-apiとslf4j-simpleの依存関係を手動で追加してください。それは良いのために依存関係の混乱を取り除くべきです。 – Perception

+0

何かがここで誤解されています:BoneCPがバインドされています(必要)1.5。これはAPIにバインドされており、上記で除外しようとしている実装ではありません。私はBoneCPのための追加の実装を含める必要があります。 BoneCPで使用されているAPIのバージョンを切り替えることはできません。質問で編集したmvn依存関係を確認してください。 – chrisapotek

0

私は同じエラーが発生しました。基本的には、クラスパスに複数のバージョンのslf4j jarがあることに注意してください。

関連する問題