8

I'm with this error on third day already and I can't resolved. There is something that I can't grasp on and no matter what I do the error still persists.

I'm reading a book called "Jenkins a definitive guide" (http://www.wakaleo.com/books/jenkins-the-definitive-guide) and I'm stuck on chapter two. Basically is a example of how to use Jenkins with Javadoc, JUnit and Cobertura plugin for Jenkins. Everything works until I get to Cobertura plugin part, where I get next error:

[ERROR] SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/C:/Windows/System32/config/systemprofile/.m2/repository/ch/qos/logback/logback-classic/1.0.13/logback-classic-1.0.13.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/Windows/System32/config/systemprofile/.m2/repository/org/slf4j/slf4j-simple/1.6.1/slf4j-simple-1.6.1.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 [ch.qos.logback.classic.util.ContextSelectorStaticBinder]

I have seen other problems like mine and the conclusion I got is that I have either to include o exclude a dependency in my pom.xml file/s (this examples only uses pom files at this stage). My pom.xml file that has slf4j-simple looks like this:

<project>
......
    <dependencies>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.6.1</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.6.1</version>
        </dependency>
    </dependencies>
</project>

and there is no explicit dependency to logback-classic hence I don't know in what dependency is being used. I tried to use dependency plugin for jenkins and I got this result:

[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ gameoflife-web ---
[INFO] com.wakaleo.gameoflife:gameoflife-web:war:1.0-SNAPSHOT
[INFO] +- com.wakaleo.gameoflife:gameoflife-core:jar:1.0-SNAPSHOT:compile
[INFO] +- org.springframework:spring-webmvc:jar:3.0.2.RELEASE:compile
[INFO] |  +- org.springframework:spring-asm:jar:3.0.2.RELEASE:compile
[INFO] |  +- org.springframework:spring-beans:jar:3.0.2.RELEASE:compile
[INFO] |  +- org.springframework:spring-context:jar:3.0.2.RELEASE:compile
[INFO] |  |  \- org.springframework:spring-aop:jar:3.0.2.RELEASE:compile
[INFO] |  +- org.springframework:spring-context-support:jar:3.0.2.RELEASE:compile
[INFO] |  \- org.springframework:spring-expression:jar:3.0.2.RELEASE:compile
[INFO] +- org.springframework:spring-core:jar:3.0.2.RELEASE:compile
[INFO] |  \- commons-logging:commons-logging:jar:1.1.1:compile
[INFO] +- org.springframework:spring-web:jar:3.0.2.RELEASE:compile
[INFO] |  \- aopalliance:aopalliance:jar:1.0:compile
[INFO] +- javax.servlet:jstl:jar:1.2:compile
[INFO] +- javax.servlet:servlet-api:jar:2.5:provided
[INFO] +- org.mockito:mockito-all:jar:1.8.5:test
[INFO] +- org.easytesting:fest-assert:jar:1.4:compile
[INFO] |  \- org.easytesting:fest-util:jar:1.1.6:compile
[INFO] +- org.slf4j:slf4j-simple:jar:1.6.1:compile
[INFO] +- org.slf4j:slf4j-api:jar:1.6.1:compile
[INFO] +- junit:junit:jar:4.11:test
[INFO] |  \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] \- org.hamcrest:hamcrest-all:jar:1.1:test

Maybe I'm blind, but I still can't see who uses logback-classic (by the way I'm not sure what values are correct for and for logback-classic). I tried to remove the slf4j dependency's and I error is gone, but I don't get any cobertura reports. I tried to exclude logback-classic with

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>1.6.1</version>
        <exclusions>
            <exclusion>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-classic</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.6.1</version>
        <exclusions>
            <exclusion>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-classic</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

and the error persists. I don't know what to do anymore, please help!

Pavel Nichita
  • 93
  • 1
  • 1
  • 4
  • 1
    possible duplicate of [Resolve multiple SLF4J bindings in maven project](http://stackoverflow.com/questions/11758676/resolve-multiple-slf4j-bindings-in-maven-project) – Tim Biegeleisen May 28 '15 at 01:18
  • 1
    Yes, it may be a possible duplicate, when I'll know for sure, I'll update it. – Pavel Nichita May 28 '15 at 08:35
  • 1
    I have same problem though the jenkin jobs are running successfully and the docker service is not running now with some binding issue shown as above. Any solutions found – Tara Prasad Gurung Jun 10 '18 at 02:53
  • 1
    @TaraPrasadGurung I doubt your problem has something to do with this, 3 years have past, this is not keep updated. – Pavel Nichita Oct 19 '18 at 14:04

3 Answers3

4

The good news is that even if SLF4J is reporting an error, it's actually warning you that SLF4J will be bound to ch.qos.logback.classic.util.ContextSelectorStaticBinder since there are two bindings available on the class path. SLF4J will pick the first one available on the class path. Your application should continue to work just fine albeit logging with logback.

I can't tell you why logback-classic.jar is on the class path but I suggest you investigate the "System profile" mentioned in the class path.

Ceki
  • 26,753
  • 7
  • 62
  • 71
  • 1
    Well, I don't get the cobertura report and this error is the only obvious reason for it. I'll investigate the "System profile" and get back with my conclusions. Thanks a lot. – Pavel Nichita May 29 '15 at 10:33
2

You are trying to exclude the logback-classic from the slf dependency itself. The issue is that as mentioned here, you were using more than one binding in your class path. Actual way is to keep exclusion for logback-classic, in the dependency which uses it and not in your slf4j dependency. Unfortunately, I am not sure which of your jars, are having a reference to slf4j which is causing the issue. One workaround is, use Ctrl+Sft+T to see the existence of the StaticLoggerBinder class, in different jars, and place the logback-classic exclusion in that. Other work around is, you can try keeping exclusion, as trial and error. These are just work arounds, but the concept is same. We need to find other dependency which has reference to logback-classic in your classpath

Ramzy
  • 6,948
  • 6
  • 18
  • 30
  • when you say "use Ctrl+Sft+T" what exactly you mean? Where should I use it? In my editor? I don't know this key shortcut. – Pavel Nichita May 28 '15 at 09:58
  • It is used to search the resource occurence in workspace including jars. – Ramzy May 28 '15 at 12:55
  • I just tried Ctrl+Sft+T and it *StatigLoggerBinder* doesn't appear. One of difficulties I have is that code is not mine, is from the book, I added all of packages that where missing (at least all I could find) and I got no luck. I guess I should trie trial and error method. Are there other ways to find out rerefences? Thanks a lot. – Pavel Nichita May 29 '15 at 10:31
0

Please follow the below Steps

Step1: Identify the classic logback using the mvn dependency:tree

Step2: Add the below exclusion in pom.xml

            <exclusions>
                <exclusion>
                    <groupId>ch.qos.logback</groupId>
                    <artifactId>logback-classic</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.logging.log4j</groupId>
                    <artifactId>log4j-to-slf4j</artifactId>
                </exclusion>
            </exclusions>

Step3: Test the application

Credits go to the https://java2blog.com/fixed-slf4j-warning-class-path-contains-multiple-slf4j-bindings/