nogunner のブログhere で概説されているパターンに従って、SLF4J ロギング ファサードを使用するバンドルを実装しようとしています。
SLF4J 実装ファイルを jar としてパッケージ化し、SLF4J api jar と共にアプリケーション バンドルにサード パーティの jar としてデプロイします。
問題は、これを行うと、SLF4J が、(SLF4J 静的ファクトリ クラスを実装する) StaticLoggerBinder がクラスパスに 2 回表示されていると不平を言っていることです。両方のライブラリ jar がバンドル クラスパスに 2 回デプロイされているようです。
サードパーティのjarを含めるためのソリューションを確認してフォローしました(こことこのサイトの投稿)。
詳細は次のとおりです。
Eclipse Standard/SDK
Version: Kepler Service Release 1
Build id: 20130919-0819
これが私のマニフェストです。にlib/osgi.slf4j.impl-1.0.0.jar
は、カスタム バインダー、ファクトリ、およびロガーの実装があります。もう 1 つの jar は、SLF4J api ディストリビューションです。
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Logging
Bundle-SymbolicName: dsct.equinox.log.frontend
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: dsct.test.useLog.Activator
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Bundle-ActivationPolicy: lazy
Import-Package: org.osgi.framework;version="1.7.0",
org.osgi.service.log;version="1.3.0"
Bundle-Classpath: lib/osgi.slf4j.impl-1.0.0.jar,
lib/slf4j-api-1.7.5.jar,
.
ビルドファイルは次のとおりです。
output.. = bin/
bin.includes = META-INF/,\
.,\
lib/
source.. = src/
そしてこれから、次の SLF4J エラーが発生します。
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [bundleresource://1.fwk899805279/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [bundleresource://1.fwk899805279:3/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [null]
これは、StaticLoggerBinder が最初と 3 番目の Bundle-ClassPath エントリの両方に含まれていることを示していると思います。
奇妙な点は次のとおりです。
マニフェストで lib/jar の順序を切り替えると、エラー メッセージに順序の変更が反映され、クラスパス エントリ 2 と 4 でそれぞれ重複が発生したことが示されます。
バンドルをエクスポートすると、問題ないように見えます: 適切なマニフェスト、2 つの jar を含む適切な lib\
したがって、ビルドが bundle-classpath jar を倍増させているように見えます。実行時のクラスパスが次のようになっている場合 (数字はクラスパス インデックスを示します):
osgi-slf4j: 0
slf4j-api: 1
. 2
パスが次のようであることを意味するインデックス 0 と 3 に重複が表示されます。
osgi-slf4j: 0
slf4j-api: 1
. 2
osgi-slf4j: 3
slf4j-api: 4
. 5
実行時のクラスパスの順序が次のようになっている場合:
. 0
slf4j-api: 1
osgi-slf4j: 2
エラー メッセージは、エントリ 2 と 5 で重複が発生していることを示しているため、クラスパスは次のようになります。
. 0
slf4j-api: 1
osgi-slf4j: 2
. 3
slf4j-api: 4
osgi-slf4j: 5
PS: project->clean を実行し、「起動前に設定をクリア」をオンに-clean
して、プログラムの引数に含めました。PDEツールも使用しました->クラスパスの更新
何が起こっているのかを突き止める方法について何か提案はありますか? ビルド/デプロイされたバンドルを検査する方法を探しましたが、何も見つかりません。私は根本的に間違ったことをしていますか?
ありがとう....
さらなる解明
osgi-slf4j jar は SLF4J 実装の私の実装であり、バージョン番号は私のものです。log4j 関係者による osgi-over-slf4j ブリッジとは何の関係もありません。
バンドル アクティベーターに少しコードを書いて、バンドル クラス ローダーを取得し、クラスパス リソースを一覧表示しました。リストは次のとおりです。
bundleresource://4.fwk899805279/
bundleresource://4.fwk899805279:1/
bundleresource://4.fwk899805279:2/
bundleresource://4.fwk899805279:3/
bundleresource://4.fwk899805279:4/
bundleresource://4.fwk899805279:5/
これは、クラスパスの数が本来の2倍であるという私の疑いを裏付けているようです。マニフェストに 3 つあるのに、クラスローダー リソースをダンプすると 6 つ表示されるのはなぜですか?
osgi-slf4j jar を削除し、そのソースを src ディレクトリに直接配置すると、すべて正常に動作します!!?? そして、クラスパス ダンプは次のようになります。
bundleresource://4.fwk899805279/
bundleresource://4.fwk899805279:1/
bundleresource://4.fwk899805279:2/
bundleresource://4.fwk899805279:3/
これは、私が期待していた 2 つではなく 4 つのエントリです