The class path contains several SLF4J binding errors

I get this error when running tring to run gradle build

I understand that there is a version conflict, but I'm not sure how to resolve it, and which ones

for exclusion ...

gradle dependency tree:

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 don’t even know how to read it ...

Can you help?

+7
gradle slf4j log4j logback
source share
3 answers

First of all, SLF4J is a simple facade for various registration frameworks (for example, java.util.logging, logback, log4j), allowing the end user to connect the required logging structure during deployment.

What does this 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 hand you will connect the framework of your choice to SLF4J, which allows you to switch different logging frames easily.

So, all the calls that you use in your code when using the SLF4J facade will be delegated to the basic logging structure.

From the figure, you can see that each time your application uses one common SLF4J API with various forms of logs.

enter image description here

Now let's look at 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. 

This is the situation of two different bindings of the SLF4J frameworks, the first on which org.slf4j / slf4j-log4j12 , which is the LOG4J logging framework , and the second is ch.qos.logback / logback-classic , which is the Logback logging framework , a built-in implementation of the SLFJ API.

So, to solve your problem you need to exclude one of them from your class path.

In particular, the problem artifact org.apache.zookeeper:zookeeper:3.4.5 allows you to exclude one of the registration frameworks:

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

Link: SLF4J User Guide

+5
source share

As @Vampire said, this seems like a problem with the buildscript class class, and not with compile or runtime configurations. This could probably be fixed with

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

Your dependency probe also contains an org.slf4j:slf4j-api dependency. So just rule it out

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

In your build.gradle just exclude it from 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 } 
-one
source share

All Articles