4

slf4j-apiバージョン1.5.5を使用するhibernate-annotations3.4.0.GAを使用するMavenプロジェクトAがあります(pom.xmlファイルの依存関係ツリーで確認)。さらにプロジェクトAは、依存関係としてslf4j-log4j12バージョン1.4.2を指定しています。

プロジェクトAに依存する別のMavenプロジェクトBがあります。プロジェクトBIで、次の依存関係を指定しています。

slf4j-api version 1.6.1,
logback-core version 0.9.24
logback-classic version 0.9.24

これは、コマンドラインからMavenを使用して正常にビルドされます。しかし、Eclipseの起動構成からプロジェクトを実行すると、次のようになります。

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/C:/Users/mm/.m2/repository/org/slf4j/slf4j-log4j12/1.4.2/slf4j-log4j12-1.4.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/Users/mm/.m2/repository/ch/qos/logback/logback-classic/0.9.24/logback-classic-0.9.24.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: slf4j-api 1.6.x (or later) is incompatible with this binding.
SLF4J: Your binding is version 1.5.5 or earlier.
SLF4J: Upgrade your binding to version 1.6.x. or 2.0.x

このメッセージから、プロジェクトAのバインディングを1.6.xにアップグレードする必要があることが示されていますが、休止状態の依存関係に含まれているため、それがどのように可能かわかりません。

プロジェクトBの実行時にバインディングを切り替えて(クラスパス情報を更新して)、休止状態のプロジェクトのバージョンではなく1.6.1バージョンを使用することはできますか?

4

2 に答える 2

9

slf4j-apiバージョン1.5.5を使用するhibernate-annotations3.4.0.GAを使用するMavenプロジェクトAがあります(pom.xmlファイルの依存関係ツリーで確認)。さらにプロジェクトAは、依存関係としてslf4j-log4j12バージョン1.4.2を指定しています。

これはお勧めしません。同じバージョンのslf4jアーティファクトを使用する必要があります。FAQから:

SLF4Jバージョンには下位互換性がありますか?

まれな理論上の例外を除いて、SLF4Jバージョンには下位互換性があります。これは、SLF4Jバージョン1.0からそれ以降のバージョンに問題なくアップグレードできることを意味します。

ただし、SLF4J APIはクライアントの観点からは非常に安定していますが、slf4j-simpleやslf4j-log4j12などのSLF4Jバインディングには、特定のバージョンのslf4j-apiが必要な場合があります。異なるバージョンのslf4jアーティファクトを混在させることは問題になる可能性があり、強くお勧めしません。たとえば、slf4j-api-1.5.6.jarを使用している場合は、slf4j-simple-1.5.6.jarも使用する必要があります。slf4j-simple-1.4.2.jarを使用しても機能しません。

初期化時に、SLF4Jがバージョンの不一致の問題がある可能性があると疑う場合、SLF4Jはその不一致について警告を発します。バージョンの不一致検出メカニズムの正確な詳細については、このFAQの関連エントリを参照してください。

それは修正する必要があります。

これは、コマンドラインからMavenを使用して正常にビルドされます。しかし、Eclipseの起動構成からプロジェクトを実行すると、(...)

問題は、SLF4JアーティファクトをBから取得し、Aから(推移的に)取得するため、 (1.5.5および1.6.1)のいくつかのバージョンとslf4j-apiいくつかのバインディングslf4j-log4j12および)を混合してしまうことlogback-classicです。SLF4Jは実行時に後の問題について不平を言っていますが、両方を修正する必要があります。

このメッセージから、プロジェクトAのバインディングを1.6.xにアップグレードする必要があることが示されていますが、休止状態の依存関係に含まれているため、それがどのように可能かわかりません。

はい、メッセージはバインディングをより新しいバージョンにアップグレードすることを提案しています。ただし、さらに重要なのは、クラスパスに複数のバインディングがあることを報告することです。ログバックとしてlog4jとlogbackのどちらかを選択し、適切なバインディングを提供する必要がありますが、両方を提供する必要はありません

プロジェクトBの実行時にバインディングを切り替えて(クラスパス情報を更新して)、休止状態のプロジェクトのバージョンではなく1.6.1バージョンを使用することはできますか?

推移的な依存関係でバージョンを制御することに関するこの質問に厳密に答えるために、これはdependencyManagement要素を使用して行うことができます。次に例を示します。

<project>
  ...
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.6.1</version>
      </dependency>
    </dependencies>
  </dependencyManagement>
  ...
  <dependencies>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-entitymanager</artifactId>
      <version>3.4.0.GA</version>
    </dependency>
  </dependencies>
  ...
</project>

slf4j-apiまた、Hibernate EntityManagerなどの依存関係 を持つアーティファクトは、以下に示すようにバージョン1.6.1を使用します。

$ mvn依存関係:ツリー
..。
[情報]+-org.hibernate:hibernate-entitymanager:jar:3.4.0.GA:compile
[情報]| +-org.hibernate:ejb3-persistence:jar:1.0.2.GA:compile
[情報]| +-org.hibernate:hibernate-commons-annotations:jar:3.1.0.GA:compile
[情報]| +-org.hibernate:hibernate-annotations:jar:3.4.0.GA:compile
[情報]| +-org.hibernate:hibernate-core:jar:3.3.0.SP1:compile
[情報]| | +-antlr:antlr:jar:2.7.6:compile
[情報]| | \-commons-collections:commons-collections:jar:3.1:compile
[情報]| +-org.slf4j:slf4j-api:jar:1.6.1:compile
[情報]| +-dom4j:dom4j:jar:1.6.1:compile
[情報]| | \-xml-apis:xml-apis:jar:1.0.b2:compile
[情報]| +-javax.transaction:jta:jar:1.1:compile
[情報]| \-javassist:javassist:jar:3.4.GA:compile

しかし、私が言ったように、本当の問題は、クラスパスに1つのバインディングだけが必要なことです。log4jまたはlogbackのいずれかを選択し、両方ではなく、適切なバインディングを提供します。

于 2010-08-23T15:09:06.657 に答える
0

この問題が発生しましたが、依存関係ツリーをクロールしてpomを修正した後も、まだ問題が発生していました。私の解決策は?

mvn clean

(誰かが私の間違いを犯した場合に備えて!)

于 2012-07-06T17:41:16.943 に答える