抑制SLF4J多个绑定Gradle

时间:2017-01-23 21:17:43

标签: java gradle slf4j

尝试在Gradle上解决臭名昭着的SLF4J多重绑定问题。 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,而org.apache.logging又使用SLF4J。如果我为apache记录器排除组,整个程序都会失败,因为该依赖项会抛出ClassNotFoundException。那么现在呢?

4 个答案:

答案 0 :(得分:3)

能够通过上述评论的组合来解决。在找到具有SLF4J的依赖关系后,我根据@badjir提到的内容添加了排除。这解决了手头的主要问题,虽然LOG4J已经出现了另一个问题,如果收到的话,我会问另一个问题。其中一个依赖项的示例:

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

答案 1 :(得分:1)

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

的依赖项
  

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

在我的情况下,我有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"
}
相关问题