【问题标题】:sbt exclusion slf4j not workingsbt 排除 slf4j 不起作用
【发布时间】:2016-07-13 22:13:21
【问题描述】:

我的游戏项目中有第三方依赖项。该第三方库最终对 slf4j 实现具有依赖关系(不是直接依赖关系)。

我收到 slf4j 的重复绑定错误。

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:~/.ivy2/cache/ch.qos.logback/logback-classic/jars/logback-classic-1.1.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/~/.ivy2/cache/com.orgname.platform/platform-logging-client/jars/platform-logging-client-2.5.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]

我尝试了以下操作,但可以摆脱错误。

"com.orgname.platform" % "platform-metric-client" % "1.0.4" excludeAll(
    ExclusionRule(organization = "org.slf4j"))

我也尝试了以下排除

"com.orgname.platform" % "platform-metric-client" % "1.0.4" exclude("org.slf4j","slf4j-jdk14)

还有这个

 "com.orgname.platform" % "platform-metric-client" % "1.0.4" exclude("org.slf4j","slf4j-log4j12)

由于我无法从第三方依赖中删除 slf4j,我厌倦了通过修改 projcts/plugin.sbt 来删除对 slf4j 的播放依赖

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

我应该如何摆脱这个警告。此警告如何影响日志记录?哪个日志实现将用于 Scala 实现?

【问题讨论】:

    标签: scala playframework sbt slf4j


    【解决方案1】:

    YourBestBet 的答案是正确的,但您可以通过将导入序列与排除项映射来节省一些复制粘贴。

    //dependencies with exclusions
    libraryDependencies ++= Seq(
        //depencies
    ).map(_.exclude("org.slf4j", "*"))
    
    //insert one without exclusion
    libraryDependencies ++= Seq(
      "ch.qos.logback" % "logback-classic" % "1.1.3"
    )
    

    编辑:

    我建议投入一些时间并了解传递依赖和范围管理。它将为您节省未来的时间。 Maven 有一个很棒且直接的文档页面: https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html

    附言。排除?提供?

    【讨论】:

      【解决方案2】:

      恕我直言,无论是 exclude 还是 excludeAll ,它只从 THAT 库中排除 slf4j 依赖,而不是从整个项目中排除 slf4j 依赖。因此,所有可能传递依赖 slf4j 的库依赖行都需要添加exclude("org.slf4j","slf4j-log4j12)。

      一个快速而肮脏的解决方案是将exclude("org.slf4j","slf4j-log4j12) 附加到每个 libraryDepencies 行。我试过了,它对我有用。

      【讨论】:

        【解决方案3】:

        如果您的目标是从项目中排除依赖项,@YourBestBet 和 @goozez 提供的两个答案都是正确的。

        在我的项目中,我有多个依赖项,其中包括 slf4j,它们相互冲突。

        一个简单的解决方法(但根据您拥有的依赖项的数量而繁琐)是手动将其从冲突的依赖项中排除,而不是根据您的需要将其完全从项目中删除。

          "org.elasticsearch" % "elasticsearch" % esVersion exclude("org.slf4j", "*"),
        

        【讨论】:

          【解决方案4】:

          告诉 SBT SLF4J 是 provided,SBT 不会将它添加到 classpath。为此,请将以下内容添加到libraryDependencies:

          "org.slf4j" % "slf4j-simple" % "1," Provided
          

          各种依赖项(或它们的传递依赖项)可能会引用具有不同版本的 SLF4J。这就是我使用Ivy version range matcher 的原因。您可能会发现您需要的实际版本匹配器与我所写的有所不同。

          【讨论】:

            猜你喜欢
            • 2020-03-19
            • 2017-12-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-03-08
            • 2012-02-11
            • 2015-07-22
            相关资源
            最近更新 更多