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 ?
Using maven run mvn dependency:tree and figure out the maven dependency and exclude log4j with snippet below to that dependency in your pom. xml . This should resolve SLF4J: Class Path Contains Multiple SLF4J Bindings.
Bindings are basically implementations of a particular SLF4J class meant to be extended to plug in a specific logging framework. By design, SLF4J will only bind with one logging framework at a time. Consequently, if more than one binding is present on the classpath, it will emit a warning.
SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/C:/Users/admin/. m2/repository/org/slf4j/slf4j-log4j12/1.6. 4/slf4j-log4j12-1.6.
Put a breakpoint on .. say.. LOG.info(...). Once debugger stops there, step into.. and viola.. you will find yourself in the code of the actual logger... say log4j or logback..
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.
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
As @Vampire said, this looks like an issue with the buildscript
classpath rather than the compile
or runtime
configurations. It could probably be fixed via
buildscript {
configurations {
classpath {
exclude group: 'ch.qos.logback', module: 'logback-classic'
// OR
exclude group: 'org.slf4j', module: 'slf4j-log4j12'
}
}
dependencies { ... }
}
Your dependency zoo also contains the org.slf4j:slf4j-api
dependency. So just exclude it
+--- 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 the 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
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With