私のプロジェクトの1つがslf4j1.5.8を使用し、Hibernateがslf4j1.6を使用していることに気付きました。 Mavenでビルドしている間、両方のjarをダウンロードしますが、1.5.8のクラスファイルが使用されていると思います。したがって、プログラムを実行すると、次のエラーが発生します。
SLF4J: The requested version 1.5.8 by your slf4j binding is not compatible with [1.6]
pom.xml
私は置きました
<dependencyManagement>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.1</version>
</dependency>
</dependencyManagement>
1.5.8は依存関係の一部であるため、単独でダウンロードされます。
ご存知のとおり、SLF4Jを2つの異なるバージョンで推移的にインポートする2つのライブラリ(Hibernateとその他のライブラリ)があります。残念ながら、古いバージョンはmavenによって取得されています(この状況でmavenが依存関係を選択する必要があるルールがいくつかあります)。解決策は、古いバージョンのSLF4Jをインポートする依存関係にexclusion
を追加することです(com.example:foo-bar
はここの例です):
<dependency>
<groupId>com.example</groupId>
<artifactId>foo-bar</artifactId>
<version>1.2.3</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
それでもこの問題が発生する場合は、以下を発行してください。
$ mvn dependency:tree
1.5.8バージョンを探し、それをインポートするすべてのライブラリから除外します。
除外することはまったく不要であり、おそらくかなり誤解を招く可能性があります。代わりに、明示的に目的のバージョンのslf4j-apiをプロジェクトのpomファイルに含めます。それでおしまい!
このアプローチは、Mavenの推移性ルールを利用します。最も近い依存関係宣言が優先されます。
次のようなもので間違ったバージョンを除外できます:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate</artifactId>
<version>3.2.7.ga</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>