I've got the following directory structure in tomcat 6:

tomcat
|-lib
|  |- logback-classic.jar
|  |- logback-core.jar
|  |- slf4j-api.jar
|  |- myState.jar
|-shared
|  |-lib
|  |  |- myStateLogback.xml
|-webapps
|  |-myApp
|  |  |-WEB-INF
|  |  |  |-logback.xml
|  |  |  |-lib
|  |  |  |  |-jcl-over-slf4j.jar
|  |  |  |  |-logback-classic.jar
|  |  |  |  |-logback-core.jar
|  |  |  |  |-slf4j-api.jar

myState.jar needs to live in the tomcat/lib directory as it is contains classes needed on tomcat startup as a global resource. It writes it's logging to slf4j so also needs the slf4j and logback jars. It uses a JoranConfigurator to load myStateLogback.xml.

myApp webapp writes it's logging to commons-logging, but I want it go through slf4j to logback in preparation for moving all our logging to slf4j, so I'm using the jcl-over-slf4j bridge.

With the above setup, the logging all works, but I get the following warning on startup:

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/D:/tomcat/lib/logback-classic-0.9.29.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/D:/tomcat/webapps/myApp/WEB-INF/lib/logback-classic-0.9.29.jar!/org/slf4j/impl/StaticLoggerBinder.class]

If I take logback-classic out of the webapp's lib dir, I get the following exception:

Exception in thread "Timer-30" java.lang.LinkageError: loader constraint violation: when resolving method "org.slf4j.impl.StaticLoggerBinder.getLoggerFactory()Lorg/slf4j/ILoggerFactory;" the class loader (instance of org/apache/catalina/loader/WebappClassLoader) of the current class, org/slf4j/LoggerFactory, and the class loader (instance of org/apache/catalina/loader/StandardClassLoader) for resolved class, org/slf4j/impl/StaticLoggerBinder, have different Class objects for the type org/slf4j/ILoggerFactory used in the signature
        at org.slf4j.LoggerFa
Edit
Report