21

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

4

3 に答える 3

27

ご存知のとおり、SLF4Jを2つの異なるバージョンで推移的にインポートする2つのライブラリ(Hibernateとその他のライブラリ)があります。残念ながら、古いバージョンはmavenによって取得されています(この状況でmavenが依存関係を選択する必要があるルールがいくつかあります)。exclusion解決策は、古いバージョンのSLF4Jをインポートする依存関係にを追加することです(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バージョンを探し、それをインポートするすべてのライブラリから除外します。

于 2011-03-29T20:03:32.910 に答える
8

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

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

于 2011-03-29T21:23:14.637 に答える
1

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

<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>
于 2011-03-29T20:02:55.880 に答える