私のJavaプロジェクトには、さまざまなSLF4Jバージョンとの依存関係があります。迷惑な警告を抑制するにはどうすればよいですか?
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:xyz234/lib/slf4j-
log4j12-1.5.8.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:xyz123/.m2/repository/org/slf4j/slf4j-log4j12
/1.6.0/slf4j-log4j12-1.6.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
追伸:これは 同じバインディングが重複していることについてのslf4j警告 と同じ質問ではありません。答えは誤警報警告を取り除く方法ですが、私の場合は真の警告です。 P.S.S。:申し訳ありませんが、言及するのを忘れました:私はMavenを使用しており、SLF4Jは依存関係の依存関係に含まれています。
_slf4j-log4j12-1.5.8.jar
_または_slf4j-log4j12-1.6.0.jar
_のいずれかをクラスパスから削除します。プロジェクトは、SLF4Jの異なるバージョンに依存するべきではありません。 1.6.0のみを使用することをお勧めします。
Mavenを使用している場合は、 推移的な依存関係を除外 できます。次に例を示します。
_<dependency>
<groupId>com.Sun.xml.stream</groupId>
<artifactId>sjsxp</artifactId>
<version>1.0.1</version>
<exclusions>
<exclusion>
<groupId>javax.xml.stream</groupId>
<artifactId>stax-api</artifactId>
</exclusion>
</exclusions>
</dependency>
_
現在のslf4j-api実装 では、これらの警告を削除することはできません。 _org.slf4j.LoggerFactory
_クラスは、メッセージを出力します。
_ ...
if (implementationSet.size() > 1) {
Util.report("Class path contains multiple SLF4J bindings.");
Iterator iterator = implementationSet.iterator();
while(iterator.hasNext()) {
URL path = (URL) iterator.next();
Util.report("Found binding in [" + path + "]");
}
Util.report("See " + MULTIPLE_BINDINGS_URL + " for an explanation.");
}
...
_
Util
クラスは次のとおりです。
_public class Util {
static final public void report(String msg, Throwable t) {
System.err.println(msg);
System.err.println("Reported exception:");
t.printStackTrace();
}
...
_
report
メソッドは_System.err
_に直接書き込みます。回避策は、_System.err
_を System.setErr()
before最初のLoggerFactory.getLogger()
を呼び出しますが、そうすると他の重要なメッセージが失われる可能性があります。
もちろん、ソースをダウンロードしてこれらの_Util.report
_呼び出しを削除し、変更したslf4j-apiをプロジェクトで使用することができます。
警告で参照されているURLを読みましたか?
SLF4J: See [http://www.slf4j.org/codes.html#multiple_bindings][1] for an explanation.
リンクの内容は次のとおりです。
SLF4J APIは、一度に1つだけの基礎となるロギングフレームワークにバインドするように設計されています。クラスパスに複数のバインディングが存在する場合、SLF4Jは警告を発し、それらのバインディングの場所をリストします。この場合、使用するバインディングを1つだけ選択し、他のバインディングを削除します。
たとえば、クラスパスにslf4j-simple-1.6.2.jarとslf4j-nop-1.6.2.jarの両方があり、nop(no-operation)バインディングを使用する場合は、slf4j-simple-を削除します。クラスパスからの1.6.2.jar。
SLF4Jによって発行される警告は、まさにその警告であることに注意してください。 SLF4Jは、クラスパスで最初に見つかったフレームワークと引き続きバインドします。
PrintStream filterOut = new PrintStream(System.err) {
public void println(String l) {
if (! l.startsWith("SLF4J")) {
super.println(l);
}
}
};
System.setErr(filterOut);
etvoilà!
クラスパスから2番目のロガーを除外すると、多くのゆがみが必要になることがあり、警告は非常に煩わしいものになります。プログラムの最初の部分が機能しているように見えるので、標準エラーをマスクします。
public static void main(String[] args)
{
org.Apache.log4j.Logger.getRootLogger().setLevel(org.Apache.log4j.Level.OFF);
PrintStream old = System.err;
System.setErr(new PrintStream(new ByteArrayOutputStream()));
// ... trigger it ...
System.setErr(old);
...
それによってtrigger it
partは、ロギングシステムにアクセスするnop関数を呼び出す必要があります。そうしないと、メッセージが生成されます。
プロダクションコードにはお勧めしませんが、skunkworksの目的には役立つはずです。
Mavenを使用する場合は、常にコマンドを使用してください
mvn dependency:tree
これにより、含まれているjarへの依存関係を含め、プロジェクトに追加されたすべての依存関係が一覧表示されます。ここでは、複数のバージョン、または追加された他のjarに付属するjarの複数のコピーを特定できます。使用する
<exclusions><exclusion><groupId></groupId><artifactId></artifactId></exclusion></exclusions>
<dependency>
競合するものを除外する要素。問題が解決しない場合は、除外するたびに上記のmavenコマンドを常に再実行してください。
古いバージョンのJetty(たとえば、Jetty 6)を使用している場合は、Webアプリのクラス読み込み順序を変更して、コンテナーよりも優先度を高くする必要がある場合があります。これを行うには、次の行をコンテナのxmlファイルに追加します。
<Set name="parentLoaderPriority">false</Set>