Class path contains multiple SLF4J bindings error

roman picture roman · Feb 20, 2017 · Viewed 18.9k times · Source

I get this error when tring to run gradle build

i understand it a versions conflict but not sure how to solve it and which

version to exclude...

gradle dependency tree is:

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

but i dont even know how to read it...

can you help please ?

Answer

Johnny picture Johnny · Mar 16, 2017

First of all, SLF4J is a simple facade for various logging frameworks (e.g. java.util.logging, logback, log4j) allowing the end user to plug in the desired logging framework at deployment time.

What does it mean in simple words?

When you use SLF4J, your code will depend on one common logging interface provided by SLF4J (SLF4J-API), and on the other side you will plug the logging framework of your choice to SLF4J which will allow you to switch different logging frameworks easily.

So, all the logging calls you use in your code while using the SLF4J facade will be delegated to the underlying logging framework.

From the illustration you can see that your app use one common API interface SLF4J API with different log frameworks each time.

enter image description here

Now, let's look on your Gradle output:

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. 

It's a situation of two different SLF4J logging framework bindings, the first on is org.slf4j/slf4j-log4j12 which is LOG4J logging framework binding, and the second one is ch.qos.logback/logback-classic which is the Logback logging framework, the native implementation of SLFJ API.

So, in order to solve your issue you need to exclude one of them from your classpath.

Specifically here, the problematic artifact is org.apache.zookeeper:zookeeper:3.4.5 so let's exclude one of the logging frameworks:

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

Reference: SLF4J manual