2017-02-20 82 views
7

我得到这个错误特林运行gradle这个构建类路径中包含多个SLF4J绑定错误

我明白一个版本冲突,但不知道如何解决这个问题,并排除其

版本时...

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. 


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 (*) 

,但我不知道如何读它...

你能帮忙吗?

+0

由于问题是运行gradle这个时候,不能在你的应用程序依赖关系发现。请显示您的构建脚本。 – Vampire

回答

-1

你的依赖动物园还包含org.slf4j:slf4j-api依赖。因此,只要排除

+--- 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 

在你build.gradle刚刚从zookeeper lib中排除。

dependencies { 
    compile('org.apache.zookeeper:zookeeper:3.4.5') { 
     // exclude transitive logging dependency from zookeeper 
     exclude group: 'org.slf4j' 
     // might need to exclude log4j, not sure? 
     exclude group: 'log4j', module: 'log4j' 
    } 
    // .. other dependencies 
} 
+0

这个答案是完全错误的。生产性应用程序没有任何问题。在类路径中使用slf4j-api是正确的,甚至可以通过slf4j绑定来传递。如错误消息所述,问题是(a)log4j绑定和logback绑定都在类路径中,(b)log4j绑定和log4j桥都在类路径中。但是,在构建期间发生这种情况,而不是在使用最终产品期间,这是buildscript类路径的问题。你的回答是完全错误的,没有buildscript,这是不能回答的。 – Vampire

1

正如@Vampire说,这就像是与buildscript类路径,而不是compileruntime配置的问题。这可能可能通过

buildscript { 
    configurations { 
     classpath { 
      exclude group: 'ch.qos.logback', module: 'logback-classic' 
      // OR 
      exclude group: 'org.slf4j', module: 'slf4j-log4j12' 
     } 
    } 
    dependencies { ... } 
} 
5

首先被固定,SLF4J是各种日志框架简单门面(例如java.util.logging中,的logback,log4j的)使最终用户能够在期望的测井塞部署时的框架。

是什么简单的话是什么意思?

当您使用SLF4J时,您的代码将取决于SLF4J(SLF4J-API)提供的一个常见日志记录界面,另一方面,您将选择的日志记录框架插入到SLF4J中,这将允许您切换不同的轻松地记录框架。

所以,所有的电话记录您在代码中使用,而使用SLF4J门面将被委托给底层的日志框架。

从图中你可以看到你的应用程序每次都使用一个通用的API接口SLF4J API有不同的日志框架。

enter image description here

现在,让我们看看你的摇篮输出:

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这被LOG4J logging framework结合,而第二个是ch.qos.logback /的logback经典这是Logback logging framework,本机实现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' 
    } 
    //... 
} 

参考:SLF4J manual

+0

你如何排除它? – emigenix

+2

添加了排除示例。 – Stas

+1

真的非常感谢在阐述问题本身所做的努力,并解释了slf4j和它的工作原理! – Montaro