私は小さなJavaアプリを構築しており、ログにログバックを使用したいと考えています。
私のアプリは、ログを介してロギングを行う古いプロジェクトに依存しています
org.Apache.commons | com.springsource.org.Apache.commons.logging | 1.1.1
...私の計画は使用することでした
org.slf4j | jcl-over-slf4j | 1.5.6
... JCLロギングをリダイレクトする
org.slf4j | slf4j-api | 1.6.0
...そして最終的に
ch.qos.logback | logback-classic | 0.9.22
ch.qos.logback | logback-core | 0.9.22
そのため、アプリはslf4j APIを介してlogbackを介してログインできますが、古いライブラリコードはリダイレクトを介して同じ場所にログインできます。
悲しいかな、これは
Java.lang.NoSuchMethodError: org.slf4j.spi.LocationAwareLogger.log(Lorg/slf4j/Marker;Ljava/lang/String;ILjava/lang/String;Ljava/lang/Throwable;)V
at org.Apache.commons.logging.impl.SLF4JLocationAwareLog.info(SLF4JLocationAwareLog.Java:141)
これらのjarファイルのいくつかについて、より高いバージョン番号とより低いバージョン番号を試してみましたが、APIドキュメントなども掘り下げましたが、問題を見つけて解決することができません。
助けてください?
ログバックは「戦略的な」ロギングフレームワークと見なされますが、最終的に使用するロギングメカニズムには多少の余裕があります。ただし、logbackまたはlog4jのいずれかを使用したいと考えています。また、共通の構成を使用して、古いプロジェクトのログを「新しい」ログフレームワークが最終的に存在するものにマージしたいと考えています。
1.5.6バージョンのjclブリッジと1.6.0バージョンのslf4j-apiを混合しています。 1.6.0でのいくつかの変更のため、これは機能しません。両方に同じバージョン、つまり1.6.1(最新)を使用します。私は常にjcl-over-slf4jブリッジを使用していますが、正常に動作します。
org.slf4j.spi.LocationAwareLogger.log
メソッドの引数リストが変更されたため(Object [] p5が追加されたため)、SLF4J 1.5.11および1.6.0バージョンは互換性がありません( 互換性レポート を参照)。
SLF4J 1.5.11:
LocationAwareLogger.log ( org.slf4j.Marker p1, String p2, int p3,
String p4, Throwable p5 )
SLF4J 1.6.0:
LocationAwareLogger.log ( org.slf4j.Marker p1, String p2, int p3,
String p4, Object[] p5, Throwable p6 )
他のSLF4Jバージョンの互換性レポートを参照してください このページ 。
japi-compliance-checker ツールを使用して、このようなレポートを生成できます。
自分と同じような状況にある人を助けるためだけに...
これは、依存ライブラリが誤ってslf4jの古いバージョンをバンドルした場合に発生する可能性があります。私の場合、それはtika-0.8でした。 https://issues.Apache.org/jira/browse/TIKA-556 を参照してください
回避策は、コンポーネントを除外してから、正しいバージョンまたはパッチが適用されたバージョンに手動で依存することです。
例えば。
<dependency>
<groupId>org.Apache.tika</groupId>
<artifactId>tika-parsers</artifactId>
<version>0.8</version>
<exclusions>
<exclusion>
<!-- NOTE: Version 4.2 has bundled slf4j -->
<groupId>edu.ucar</groupId>
<artifactId>netcdf</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<!-- Patched version 4.2-min does not bundle slf4j -->
<groupId>edu.ucar</groupId>
<artifactId>netcdf</artifactId>
<version>4.2-min</version>
</dependency>