抑制 SLF4J 多重绑定 Gradle

Suppress SLF4J Multiple Bindings Gradle

正在尝试解决 Gradle 上臭名昭著的 SLF4J 多重绑定问题。这里有大约一百万个 Maven 解决方案,但其中 none 正在转换为 Gradle(显然不是 Gradle 专家)。我已经尝试了一些涉及 configurations 的解决方案,但是 none 工作正常。这是我遇到的错误(正如我提到的,我试图抑制警告)

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。那么现在呢?

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

这样的依赖项

exclude group: 'org.unwanted', module: 'iAmBuggy' //by both name and group

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

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

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

在我的例子中,我有 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"
}