Gradle 类路径包含多个SLF4J绑定错误

Gradle 类路径包含多个SLF4J绑定错误,gradle,log4j,logback,slf4j,slf4j-api,Gradle,Log4j,Logback,Slf4j,Slf4j Api,我在尝试运行gradle build时遇到此错误 我理解这是一个版本冲突,但不知道如何解决它,哪个版本冲突 要排除的版本 渐变依赖关系树是: SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/C:/Users/i/.gradle/caches/modules- 2/files-2.1/org.slf4j/slf4j- log4j12/1.6.1/bd245d6746cdd

我在尝试运行gradle build时遇到此错误

我理解这是一个版本冲突,但不知道如何解决它,哪个版本冲突

要排除的版本

渐变依赖关系树是:

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/C:/Users/i/.gradle/caches/modules-
2/files-2.1/org.slf4j/slf4j- 
log4j12/1.6.1/bd245d6746cdd4e6203e976e21d597a46f115802/slf4j-log4j12-
1.6.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in   
[jar:file:/C:/Users/i/.gradle/caches/modules-2/files-
2.1/ch.qos.logback/logback- 
classic/1.1.3/d90276fff414f06cb375f2057f6778cd63c6082f/logback-classic-
1.1.3.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.impl.Log4jLoggerFactory]
SLF4J: Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar on the class    
path, preempting StackOverflowError. 


 compile - Compile classpath for source set 'main'.
 +--- com.google.code.gson:gson:2.2.4
 +--- com.fasterxml.jackson.core:jackson-core:2.6.0
 +--- com.fasterxml.jackson.core:jackson-databind:2.6.0
 |    +--- com.fasterxml.jackson.core:jackson-annotations:2.6.0
 |    \--- com.fasterxml.jackson.core:jackson-core:2.6.0
 +--- com.fasterxml.jackson.core:jackson-annotations:2.6.0
 +--- com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.6.0
 |    +--- com.fasterxml.jackson.core:jackson-core:2.6.0
 |    \--- org.yaml:snakeyaml:1.15
 +--- org.projectlombok:lombok:1.16.10
 +--- javax.validation:validation-api:1.1.0.Final
 +--- org.apache.commons:commons-lang3:3.4
 +--- org.apache.zookeeper:zookeeper:3.4.5
 |    +--- org.slf4j:slf4j-api:1.6.1 -> 1.7.21
 |    +--- org.slf4j:slf4j-log4j12:1.6.1
 |    |    +--- org.slf4j:slf4j-api:1.6.1 -> 1.7.21
 |    |    \--- log4j:log4j:1.2.16
 |    +--- log4j:log4j:1.2.15 -> 1.2.16
 |    +--- jline:jline:0.9.94
 |    |    \--- junit:junit:3.8.1
 |    \--- org.jboss.netty:netty:3.2.2.Final
 +--- org.apache.httpcomponents:httpcore:4.4.5 -> 4.4.6
 +--- org.apache.httpcomponents:httpclient:4.5.3
 |    +--- org.apache.httpcomponents:httpcore:4.4.6
 |    +--- commons-logging:commons-logging:1.2
 |    \--- commons-codec:commons-codec:1.9
 +--- commons-io:commons-io:2.5
 +--- org.jdom:jdom2:2.0.5
 \--- org.slf4j:slf4j-api:1.7.21

 default - Configuration for default artifacts.
 +--- com.google.code.gson:gson:2.2.4
 +--- com.fasterxml.jackson.core:jackson-core:2.6.0
 +--- com.fasterxml.jackson.core:jackson-databind:2.6.0
 |    +--- com.fasterxml.jackson.core:jackson-annotations:2.6.0
 |    \--- com.fasterxml.jackson.core:jackson-core:2.6.0
 +--- com.fasterxml.jackson.core:jackson-annotations:2.6.0
 +--- com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.6.0
 |    +--- com.fasterxml.jackson.core:jackson-core:2.6.0
 |    \--- org.yaml:snakeyaml:1.15
 +--- org.projectlombok:lombok:1.16.10
 +--- javax.validation:validation-api:1.1.0.Final
 +--- org.apache.commons:commons-lang3:3.4
 +--- org.apache.zookeeper:zookeeper:3.4.5
 |    +--- org.slf4j:slf4j-api:1.6.1 -> 1.7.21
 |    +--- org.slf4j:slf4j-log4j12:1.6.1
 |    |    +--- org.slf4j:slf4j-api:1.6.1 -> 1.7.21
 |    |    \--- log4j:log4j:1.2.16
 |    +--- log4j:log4j:1.2.15 -> 1.2.16
 |    +--- jline:jline:0.9.94
 |    |    \--- junit:junit:3.8.1
 |    \--- org.jboss.netty:netty:3.2.2.Final
 +--- org.apache.httpcomponents:httpcore:4.4.5 -> 4.4.6
 +--- org.apache.httpcomponents:httpclient:4.5.3
 |    +--- org.apache.httpcomponents:httpcore:4.4.6
 |    +--- commons-logging:commons-logging:1.2
 |    \--- commons-codec:commons-codec:1.9
 +--- commons-io:commons-io:2.5
 +--- org.jdom:jdom2:2.0.5
 \--- org.slf4j:slf4j-api:1.7.21

 runtime - Runtime classpath for source set 'main'.
 +--- com.google.code.gson:gson:2.2.4
 +--- com.fasterxml.jackson.core:jackson-core:2.6.0
 +--- com.fasterxml.jackson.core:jackson-databind:2.6.0
 |    +--- com.fasterxml.jackson.core:jackson-annotations:2.6.0
 |    \--- com.fasterxml.jackson.core:jackson-core:2.6.0
 +--- com.fasterxml.jackson.core:jackson-annotations:2.6.0
 +--- com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.6.0
 |    +--- com.fasterxml.jackson.core:jackson-core:2.6.0
 |    \--- org.yaml:snakeyaml:1.15
 +--- org.projectlombok:lombok:1.16.10
 +--- javax.validation:validation-api:1.1.0.Final
 +--- org.apache.commons:commons-lang3:3.4
 +--- org.apache.zookeeper:zookeeper:3.4.5
 |    +--- org.slf4j:slf4j-api:1.6.1 -> 1.7.21
 |    +--- org.slf4j:slf4j-log4j12:1.6.1
 |    |    +--- org.slf4j:slf4j-api:1.6.1 -> 1.7.21
 |    |    \--- log4j:log4j:1.2.16
 |    +--- log4j:log4j:1.2.15 -> 1.2.16
 |    +--- jline:jline:0.9.94
 |    |    \--- junit:junit:3.8.1
 |    \--- org.jboss.netty:netty:3.2.2.Final
 +--- org.apache.httpcomponents:httpcore:4.4.5 -> 4.4.6
 +--- org.apache.httpcomponents:httpclient:4.5.3
 |    +--- org.apache.httpcomponents:httpcore:4.4.6
 |    +--- commons-logging:commons-logging:1.2
 |    \--- commons-codec:commons-codec:1.9
 +--- commons-io:commons-io:2.5
 +--- org.jdom:jdom2:2.0.5
 \--- org.slf4j:slf4j-api:1.7.21

 testCompile - Compile classpath for source set 'test'.
 +--- com.google.code.gson:gson:2.2.4
 +--- com.fasterxml.jackson.core:jackson-core:2.6.0
 +--- com.fasterxml.jackson.core:jackson-databind:2.6.0
 |    +--- com.fasterxml.jackson.core:jackson-annotations:2.6.0
 |    \--- com.fasterxml.jackson.core:jackson-core:2.6.0
 +--- com.fasterxml.jackson.core:jackson-annotations:2.6.0
 +--- com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.6.0
 |    +--- com.fasterxml.jackson.core:jackson-core:2.6.0
 |    \--- org.yaml:snakeyaml:1.15
 +--- org.projectlombok:lombok:1.16.10
 +--- javax.validation:validation-api:1.1.0.Final
 +--- org.apache.commons:commons-lang3:3.4
 +--- org.apache.zookeeper:zookeeper:3.4.5
 |    +--- org.slf4j:slf4j-api:1.6.1 -> 1.7.21
 |    +--- org.slf4j:slf4j-log4j12:1.6.1
 |    |    +--- org.slf4j:slf4j-api:1.6.1 -> 1.7.21
 |    |    \--- log4j:log4j:1.2.16
 |    +--- log4j:log4j:1.2.15 -> 1.2.16
 |    +--- jline:jline:0.9.94
 |    |    \--- junit:junit:3.8.1 -> 4.11
 |    |         \--- org.hamcrest:hamcrest-core:1.3
 |    \--- org.jboss.netty:netty:3.2.2.Final
 +--- org.apache.httpcomponents:httpcore:4.4.5 -> 4.4.6
 +--- org.apache.httpcomponents:httpclient:4.5.3
 |    +--- org.apache.httpcomponents:httpcore:4.4.6
 |    +--- commons-logging:commons-logging:1.2
 |    \--- commons-codec:commons-codec:1.9
 +--- commons-io:commons-io:2.5
 +--- org.jdom:jdom2:2.0.5
 +--- org.slf4j:slf4j-api:1.7.21
 \--- junit:junit:4.11 (*)

 testRuntime - Runtime classpath for source set 'test'.
 +--- com.google.code.gson:gson:2.2.4
 +--- com.fasterxml.jackson.core:jackson-core:2.6.0
 +--- com.fasterxml.jackson.core:jackson-databind:2.6.0
 |    +--- com.fasterxml.jackson.core:jackson-annotations:2.6.0
 |    \--- com.fasterxml.jackson.core:jackson-core:2.6.0
 +--- com.fasterxml.jackson.core:jackson-annotations:2.6.0
 +--- com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.6.0
 |    +--- com.fasterxml.jackson.core:jackson-core:2.6.0
 |    \--- org.yaml:snakeyaml:1.15
 +--- org.projectlombok:lombok:1.16.10
 +--- javax.validation:validation-api:1.1.0.Final
 +--- org.apache.commons:commons-lang3:3.4
 +--- org.apache.zookeeper:zookeeper:3.4.5
 |    +--- org.slf4j:slf4j-api:1.6.1 -> 1.7.21
 |    +--- org.slf4j:slf4j-log4j12:1.6.1
 |    |    +--- org.slf4j:slf4j-api:1.6.1 -> 1.7.21
 |    |    \--- log4j:log4j:1.2.16
 |    +--- log4j:log4j:1.2.15 -> 1.2.16
 |    +--- jline:jline:0.9.94
 |    |    \--- junit:junit:3.8.1 -> 4.11
 |    |         \--- org.hamcrest:hamcrest-core:1.3
 |    \--- org.jboss.netty:netty:3.2.2.Final
 +--- org.apache.httpcomponents:httpcore:4.4.5 -> 4.4.6
 +--- org.apache.httpcomponents:httpclient:4.5.3
 |    +--- org.apache.httpcomponents:httpcore:4.4.6
 |    +--- commons-logging:commons-logging:1.2
 |    \--- commons-codec:commons-codec:1.9
 +--- commons-io:commons-io:2.5
 +--- org.jdom:jdom2:2.0.5
 +--- org.slf4j:slf4j-api:1.7.21
 \--- junit:junit:4.11 (*)
但我甚至不知道怎么读


您能帮忙吗?

您的dependency zoo还包含org.slf4j:slf4j api dependency。所以就排除它吧

+--- org.apache.zookeeper:zookeeper:3.4.5
 |    +--- org.slf4j:slf4j-api:1.6.1 -> 1.7.21
 |    +--- org.slf4j:slf4j-log4j12:1.6.1
 |    |    +--- org.slf4j:slf4j-api:1.6.1 -> 1.7.21    # <-- dependency includes slf4j-api
 |    |    \--- log4j:log4j:1.2.16
 |    +--- log4j:log4j:1.2.15 -> 1.2.16
 |    +--- jline:jline:0.9.94
 |    |    \--- junit:junit:3.8.1
 |    \--- org.jboss.netty:netty:3.2.2.Final
 +--- org.apache.httpcomponents:httpcore:4.4.5 -> 4.4.6
 +--- org.apache.httpcomponents:httpclient:4.5.3
 |    +--- org.apache.httpcomponents:httpcore:4.4.6
 |    +--- commons-logging:commons-logging:1.2
 |    \--- commons-codec:commons-codec:1.9
 +--- commons-io:commons-io:2.5
 +--- org.jdom:jdom2:2.0.5
 +--- org.slf4j:slf4j-api:1.7.21  # <-- Also included as a first tier dependency

正如@Vampire所说,这看起来像是buildscript类路径的问题,而不是编译或运行时配置的问题。它可能会通过

buildscript {
    configurations {
        classpath {
            exclude group: 'ch.qos.logback', module: 'logback-classic'
            // OR
            exclude group: 'org.slf4j', module: 'slf4j-log4j12'
        }
    }
    dependencies { ... }
} 
首先,是各种日志框架的简单外观,例如java.util.logging、logback、log4j,允许最终用户在部署时插入所需的日志框架

用简单的话来说是什么意思

当您使用SLF4J时,您的代码将依赖于SLF4J SLF4J-API提供的一个通用日志接口,另一方面,您将选择的日志框架插入SLF4J,这将允许您轻松切换不同的日志框架

因此,使用SLF4J facade时在代码中使用的所有日志调用都将委托给底层日志框架

从图中可以看出,您的应用程序每次都使用一个通用API接口SLF4J API和不同的日志框架

现在,让我们看看Gradle的输出:

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/C:/Users/i/.gradle/caches/modules-
2/files-2.1/org.slf4j/slf4j- 
log4j12/1.6.1/bd245d6746cdd4e6203e976e21d597a46f115802/slf4j-log4j12-
1.6.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in   
[jar:file:/C:/Users/i/.gradle/caches/modules-2/files-
2.1/ch.qos.logback/logback- 
classic/1.1.3/d90276fff414f06cb375f2057f6778cd63c6082f/logback-classic-
1.1.3.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.impl.Log4jLoggerFactory]
SLF4J: Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar on the class    
path, preempting StackOverflowError. 
这是两种不同的SLF4J日志框架绑定的情况,第一种是org.SLF4J/SLF4J-log4j12,它是绑定的,第二种是ch.qos.logback/logback-classic,它是SLFJ API的本机实现

因此,为了解决您的问题,您需要将其中一个从类路径中排除

特别是在这里,有问题的工件是org.apache.zookeeper:zookeeper:3.4.5,所以让我们排除其中一个日志框架:

dependencies {
    compile('org.apache.zookeeper:zookeeper:3.4.5') {
        exclude group: 'ch.qos.logback', module: 'logback-classic'
    }
    //...
}

参考资料:

在尝试了几件事情之后,链接中的问题的答案对我很有用


因为问题是在运行gradle时,在应用程序依赖项中找不到它。请显示您的构建脚本。这个答案完全错误。生产应用程序没有任何问题。在类路径中使用slf4j api是正确的,甚至可以通过slf4j绑定传递地拉入。正如错误消息所述,问题是a log4j绑定和logback绑定都在类路径中,b log4j绑定和log4j桥都在类路径中。但是,由于这是在构建过程中发生的,而不是在使用最终产品的过程中发生的,因此这是一个buildscript类路径的问题。您的答案完全错误,没有构建脚本,这是不可回答的。您如何排除它?添加了一个排除的示例。非常感谢您在阐述问题本身以及解释什么是slf4j以及它是如何工作的过程中所做的努力@Montaro很乐意帮助您:您是如何确定org.apache.zookeeper:zookeeper:3.4.5是有问题的工件的?
dependencies {
    compile('org.apache.zookeeper:zookeeper:3.4.5') {
        exclude group: 'ch.qos.logback', module: 'logback-classic'
    }
    //...
}
configurations.all {
    resolutionStrategy.eachDependency { DependencyResolveDetails details ->
        if (details.requested.name == 'log4j') {
            details.useTarget 'log4j:log4j:1.2.+'
        }
    }
}