首页 文章

与Play 2.3.8的多个SLF4J绑定

提问于
浏览
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插件 .

我在这里和邮件列表中阅读了很多类似的问题 . 示例:How to fix "SLF4J: Class path contains multiple SLF4J bindings" at startup of Play 2.3.x?常见的解决方案是使用某种形式的排除规则 . 所有建议的解决方案都不适合我 . [更新:实际上,他们这样做 - 请参阅下面的解决方案 . ]我不希望slf4j-simple出现在最终的类路径中,但确实如此 . 即使我将excludeAll(ExclusionRule(organization = "org.slf4j"))添加到我的项目中的每个依赖项,除了play框架 .

关于如何摆脱slf4j简单的任何想法?最好在sbt项目级别,无需手动清理构建结果的类路径 .

Update: instructions to reproduce

我已经通过一个小型测试项目缩小了范围 . 事实证明它是由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的工作原理相同 .

2 回答

  • 0

    我的错 . 最后,在project / plugins.sbt中进行了一个简单的排除修复了这个问题:

    addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.3.8" exclude("org.slf4j", "slf4j-simple"))
    

    我之前尝试过这个,但显然出现了语法错误,并认为这不受支持 . 捂脸

  • 7

    我最后不得不做一些与我在另一篇文章中看到的有些不同的事情 . 把它放在这里,任何搜索可怕的多重绑定的人都会先点击此页面:

    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")) }
    

相关问题