我使用Play Framework 2.3.8(for Java)和Scala 2.11。
我收到了这个警告:
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插件。
我在这里和邮件列表中阅读了很多类似的问题。例: How to fix "SLF4J: Class path contains multiple SLF4J bindings" at startup of Play 2.3.x? 常见的解决方案是使用某种形式的排除规则。没有一个建议的解决方案适合我。 [更新:事实上,他们确实如此 - 请参阅下面的解决方案。]我不希望slf4j-simple出现在最终的类路径中,但确实如此。即使我将excludeAll(ExclusionRule(organization =“org.slf4j”))添加到我的项目中的每个依赖项,但播放框架除外。
关于如何摆脱slf4j简单的任何想法?最好在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的工作原理相同。
答案 0 :(得分:7)
我的坏。最后,在project / plugins.sbt中进行了一个简单的排除修复了这个:
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.3.8" exclude("org.slf4j", "slf4j-simple"))
我之前尝试过这个,但显然出现了语法错误,并认为这不受支持。 捂脸
答案 1 :(得分:0)
我最终不得不做一些与另一篇文章中所见有所不同的事情。将其放在此处,以防任何人搜索可怕的多个绑定会首先点击此页面:
How to fix "SLF4J: Class path contains multiple SLF4J bindings" at startup of Play 2.3.x?
libraryDependencies ++= Seq(
...
).map(_.force())
libraryDependencies ~= { _.map(_.exclude("org.slf4j", "slf4j-nop")) }