8

Scala 2.11 で Play Framework 2.3.8 (Java 用) を使用しています。

次の警告が表示されます。

SLF4J: クラスパスに複数の SLF4J バインディングが含まれています。
SLF4J: [jar:file:/Users/vdanylchuk/.ivy2/cache/org.slf4j/slf4j-simple/jars/slf4j-simple-1.7.7.jar!/org/slf4j/impl/StaticLoggerBinder.class でバインドが見つかりました]
SLF4J: [jar:file:/Users/vdanylchuk/.ivy2/cache/ch.qos.logback/logback-classic/jars/logback-classic-1.0.13.jar!/org/slf4j/impl/ でバインドが見つかりましたStaticLoggerBinder.class] SLF4J: 説明については、http: //www.slf4j.org/codes.html#multiple_bindings
を 参照してください。

これにより、実行時にランダムな方法で実際の問題が発生します。デプロイされたホストの一部では、すべてがうまくいき、ログが構成どおりに書き込まれます。他のホストでは、間違ったバインディングが優先され、ログが間違った場所に書き込まれます。展開プロセスはスクリプト化されており、まったく同じです。したがって、 http://www.slf4j.org/codes.html#multiple_bindingsの警告は正しく、これはランダムであるため、余分なバインディングを削除する必要があります。

おもしろいことに、どちらも Play フレームワークから来ています。logback-classic (私が実際に使用したい) は play ライブラリから取得され、slf4j-simple は play sbt プラグインから取得されます。

こことメーリングリストで同様の質問をたくさん読みました。例: Play 2.3.x の起動時に "SLF4J: クラスパスに複数の SLF4J バインディングが含まれています" を修正するには? 一般的な解決策は、何らかの形式の除外ルールを使用することです。提案された解決策はどれもうまくいきませんでした。[更新: 実際、そうです - 以下の解決策を参照してください。] slf4j-simple が最終的なクラスパスに現れるとは思いませんが、そうです。プロジェクトのすべての依存関係に excludeAll(ExclusionRule(organization = "org.slf4j")) を追加しましたが、play フレームワークは除きます。

slf4j-simple を取り除く方法についてのアイデアはありますか? ビルド結果のクラスパスを手動でクリーンアップせずに、できれば sbt プロジェクト レベルで。

更新: 再現手順

小さなテストプロジェクトで絞り込みました。play sbt プラグインと、私たちが使用する aether-deploy プラグインの組み合わせによってトリガーされることが判明しました。この小さな構成で十分です。
build.sbt:

name := "slf4j-test"
version := "1.0"
scalaVersion := "2.11.5"
lazy val root = (project in file(".")).enablePlugins(PlayJava)


プロジェクト/plugins.sbt:

resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/"
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.3.8")
addSbtPlugin("no.arktekk.sbt" % "aether-deploy" % "0.13")


プロジェクト/build.properties:

sbt.version=0.13.7

次に、"sbt test:compile" または "sbt run" を実行 (および localhost:9000 にクエリ) して、警告を表示します。scala 2.10 でも同じように動作します。

4

2 に答える 2

0

別の投稿で見たのとは少し違うことをしなければならなくなりました。恐ろしい複数のバインディングを探している人が最初にこのページにヒットする場合に備えて、ここに置いておきます。

Play 2.3.x の起動時に "SLF4J: クラスパスに複数の SLF4J バインディングが含まれています" を修正するには?

libraryDependencies ++= Seq(
  ...
).map(_.force())

libraryDependencies ~= { _.map(_.exclude("org.slf4j", "slf4j-nop")) }
于 2018-06-21T20:53:34.077 に答える