web-dev-qa-db-ja.com

Maven + SLF4J:2つの異なるSLF4Jバージョンを必要とする2つの異なる依存関係を使用する場合のバージョンの競合

BoneCPとHibernateの両方の依存関係を独立して使用するプロジェクトがあります。ただし、SLF4Jとそのバージョンの競合のおかげで、BoneCPにはSLF4J 1.5が必要であり、HibernateにはSLF4j 1.6が必要なので、動作しません。ご存知のように、pom.xmlで同じ依存関係の2つの異なるバージョンを重要にすることはできません。この驚くべき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.

これを追加する必要がありますが、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
22
chrisapotek

エラーメッセージ「 http://www.slf4j.org/codes.html#version_mismatch 」に記載されているリンクは、

SLF4Jバインディングは、slf4jを基礎となるロギングフレームワーク(Java.util.loggingやlog4jなど)にバインドするために使用されるslf4j-jdk14.jarやslf4j-log4j12.jarなどのアーティファクトを指定します。 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.jarのバージョンと一致することを確認するだけです。プロジェクトの特定の依存関係で使用されるslf4j-api.jarのバージョンについて心配する必要はありません。 slf4j-api.jarの任意のバージョンをいつでも使用できます。slf4j-api.jarのバージョンとそのバインディングが一致する限り、問題ありません。

Slf4j-apiのすべてのバージョンは、slf4j-apiのさまざまなバージョンとそのバインディング(例: slf4j-log4j12が取り込まれ、次のようにPOMで依存関係として明示的に宣言されます。

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.7.25</version>
</dependency>   

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

ここでは、提供されたスコープでslf4j-apiとslf4j-log4j12を実際に宣言する必要はないと想定しています。

依存性メカニズムの紹介 も参照してください:

依存性メディエーション-これにより、アーティファクトの複数のバージョンが検出されたときに使用される依存関係のバージョンが決定されます。現在、Maven 2.0は「nearest definition」の使用のみをサポートしています。つまり、依存関係のツリーでプロジェクトに最も近い依存関係のバージョンを使用します。 。 プロジェクトのPOMで明示的に宣言することで、いつでもバージョンを保証できます。

30
Ceki

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>
5
e-zinc

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

0
Binita Bharati