【问题标题】:Suppress SLF4J Multiple Bindings Gradle抑制 SLF4J 多个绑定 Gradle
【发布时间】:2017-06-08 12:28:42
【问题描述】:

试图解决 Gradle 上臭名昭著的 SLF4J 多绑定问题。这里有大约 100 万个 Maven 解决方案,但没有一个可以翻译成 Gradle(显然不是 Gradle 专家)。我尝试了一些涉及configurations 的解决方案,但没有一个能正常工作。这是我遇到的错误(正如我提到的,我正在尝试抑制警告)

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in     [jar:file:~/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-nop/1.7.22/3a4392836f875995446373b008e39cdb9a532fbe/slf4j-nop-1.7.22.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:~/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-slf4j-impl/2.7/382b070836b8940a02d28c936974db95e9bfc3a4/log4j-slf4j-impl-2.7.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.helpers.NOPLoggerFactory]

这是我项目中唯一的 SLF4J 依赖:

dependencies {
    compile group: 'org.slf4j', name: 'slf4j-nop', version: '1.7.+'
    ...
}

另外,如果有帮助,我在运行单元测试时会遇到问题。

更新:发现其中一个依赖项是使用 org.apache.logging,而后者又使用 SLF4J。如果我排除 apache 记录器的组,则整个程序将失败,因为该依赖项会引发 ClassNotFoundException。那么现在呢?

【问题讨论】:

  • 除了 SLF4J 之外,Gradle 还包括哪些其他依赖项?
  • 一长串,尽管没有一个是 SLF4J 或 LOG4J,至少直接如此。显然其中一个或多个拥有它。
  • 你试过runtime.exclude group,如this answer所示?
  • 现在可以试试了,我在配置中做了很多排除的变体,但似乎没有任何作用。奇怪的是,我已经删除了所有内容,并且日志记录自行关闭。
  • 是的,它不再记录任何内容。不确定我应该如何处理这个问题,但我的 Gradle 文件没有其他更改,它刚刚停止:/

标签: java gradle slf4j


【解决方案1】:

您可以排除您不想使用的依赖项。 Gradle docs 表示您可以排除类似的依赖项

排除组:'org.unwanted',模块:'iAmBuggy' //按名称和 组

【讨论】:

  • 这看起来只有在我知道导致此问题的依赖项时才有效。我正在尝试排除任何和所有依赖项。
  • 不确定发生了什么,但它随机停止记录...我的 Gradle 文件没有更改。这令人沮丧。
  • @MarkII,它会告诉您哪些 jar 文件发生了冲突的依赖关系。有没有一种方法可以查看项目的所有依赖项并查看哪些依赖项包含这些 jar 文件?
  • 可能,但是要遍历每个依赖项并研究其依赖项等等,这将是非常艰苦的。从它在 Maven 中看起来多么容易,我认为有一种方法可以排除整个项目。
【解决方案2】:

这个错误是因为你有多个使用slf4j 日志框架的库。您需要做的是找到传递slf4j 作为依赖项的库并添加exclude (group: "slf4j's-group")。找到导致问题的包的一种简单方法是使用gradle dependencies,它将生成所有依赖项的树。

【讨论】:

  • 今天会试一试,因为警告已经返回
  • 运行依赖项,发现 3 个具有某种形式的 slf4j,添加了您的排除项(没有运气),并根据我从 Gradle 文档中的想法添加了排除项(没有运气)。老实说,在这一点上真的很讨厌 SLF4J。
【解决方案3】:

能够通过上述 cmets 的组合来解决。在找到具有 SLF4J 的依赖项后,我根据@badjir 提到的内容添加了排除项。这解决了手头的主要问题,尽管 LOG4J 出现了另一个问题,如果继续,我会问另一个问题。依赖项之一的示例:

compile (group: 'com.sparkjava', name: 'spark-core', version: '2.5.4') {
    exclude group: 'org.slf4j'
}

【讨论】:

  • 这是我告诉你的:)
  • 是的,抱歉,尝试将两个答案提供者都归于属性。尽管您的确切解决方案也无法正常工作,但最终还是像提供的其他帖子一样遵循 Gradle Docs 示例。所以从某种意义上说,你们俩基本上都是对的。
【解决方案4】:

在我的例子中,我有 3 个绑定(logback-classic、slf4j-log4j12 和 log4j-nop)并且没有时间梳理依赖关系。我读了这个 http://buransky.com/programming/exclude-log4j-to-use-slf4j-with-logback-in-a-gradle-project/ 并将这些添加到 build.gradle 并且它有效。

configurations.all {
  exclude group: "org.slf4j", module: "slf4j-nop"
  exclude group: "org.slf4j", module: "slf4j-log4j12"
}

【讨论】:

    猜你喜欢
    • 2011-11-26
    • 2019-08-01
    • 2020-06-07
    • 2018-07-10
    • 1970-01-01
    • 2012-09-28
    • 2016-01-09
    • 2015-04-24
    • 1970-01-01
    相关资源
    最近更新 更多