web-dev-qa-db-ja.com

Mavenでビルド中にslf4jバージョンが競合する

私のプロジェクトの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は依存関係の一部であるため、単独でダウンロードされます。

18
harshit

ご存知のとおり、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バージョンを探し、それをインポートするすべてのライブラリから除外します。

25

除外することはまったく不要であり、おそらくかなり誤解を招く可能性があります。代わりに、明示的に目的のバージョンのslf4j-apiをプロジェクトのpomファイルに含めます。それでおしまい!

このアプローチは、Mavenの推移性ルールを利用します。最も近い依存関係宣言が優先されます。

8
Ceki

次のようなもので間違ったバージョンを除外できます:

<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>
1