slf4j-apiバージョン1.5.5を使用するhibernate-annotations3.4.0.GAを使用するMavenプロジェクトAがあります(pom.xmlファイルの依存関係ツリーで確認)。さらにプロジェクトAは、依存関係としてslf4j-log4j12バージョン1.4.2を指定しています。
これはお勧めしません。同じバージョンのslf4jアーティファクトを使用する必要があります。FAQから:
まれな理論上の例外を除いて、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のいずれかを選択し、両方ではなく、適切なバインディングを提供します。