title: Definitive answer on slf4j and logback-classic transitive dependency
body: <p>I have really struggled with the loading of logback-classic as a transitive dependency problem. I follow the advice found here  on stackoverflow, but, it keeps re-occurring.</p>
  
  <p>I use maven exclusions to try to try to control it, it does not appear at all in my pom dependencies hierarchy. And yet it still gets loaded!</p>
  
  <p>Here is my runtime trace</p>
  
  <pre><code>SLF4J: Class path contains multiple SLF4J bindings.
  SLF4J: Found binding in [jar:file:/home/david/.m2/repository/de/ruedigermoeller/kontraktor-http/3.33/kontraktor-http-3.33.jar!/org/slf4j/impl/StaticLoggerBinder.class]
  SLF4J: Found binding in [jar:file:/home/david/.m2/repository/ch/qos/logback/logback-classic/1.2.1/logback-classic-1.2.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
  SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
  W 13:22:24:837 : DispatcherThread 1 : DispatcherThread : 
  java.lang.NoSuchMethodError: org.slf4j.impl.StaticLoggerBinder.getLoggerFactoryClassStr()Ljava/lang/String;
  at org.slf4j.LoggerFactory.reportActualBinding(LoggerFactory.java:271)
  at org.slf4j.LoggerFactory.bind(LoggerFactory.java:143)
  at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:120)
  at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:331)
  at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:283)
  at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:304)
  at org.quartz.impl.StdSchedulerFactory.&lt;init&gt;(StdSchedulerFactory.java:284)
  at org.quartz.impl.StdSchedulerFactory.getDefaultScheduler(StdSchedulerFactory.java:1539)
  at uk.co.example.ExampleEwsService.init(ExampleEwsService.java:296)
  </code></pre>
  
  <p>Part of the problem is that the Kontraktor framework overrides the StaticLoggerBinder.getLoggerFactoryClassStr method. But it is easy to make sure it gets loaded first and then to exclude the logback-classic from quartz, which is loading it, as follows:</p>
  
  <pre><code>    &lt;dependency&gt;
          &lt;groupId&gt;org.quartz-scheduler&lt;/groupId&gt;
          &lt;artifactId&gt;quartz&lt;/artifactId&gt;
          &lt;version&gt;2.2.3&lt;/version&gt;
          &lt;exclusions&gt;
              &lt;exclusion&gt;
                  &lt;groupId&gt;org.slf4j&lt;/groupId&gt;
                  &lt;artifactId&gt;slf4j-api&lt;/artifactId&gt;
              &lt;/exclusion&gt;
          &lt;/exclusions&gt;
      &lt;/dependency&gt;
      &lt;dependency&gt;
          &lt;groupId&gt;org.quartz-scheduler&lt;/groupId&gt;
          &lt;artifactId&gt;quartz-jobs&lt;/artifactId&gt;
          &lt;version&gt;2.2.3&lt;/version&gt;
      &lt;/dependency&gt;
  </code></pre>
  
  <p>At this point slf4j is only loaded by kontraktor. logback-classic appears nowhere in the dependency:tree</p>
  
  <pre><code>[INFO] +- de.ruedigermoeller:kontraktor:jar:3.33:compile
  [INFO] |  +- org.jctools:jctools-core:jar:1.0:compile
  [INFO] |  \- de.ruedigermoeller:fst:jar:2.44.5:compile
  [INFO] |     +- com.fasterxml.jackson.core:jackson-core:jar:2.5.3:compile
  [INFO] |     +- org.javassist:javassist:jar:3.19.0-GA:compile
  [INFO] |     +- org.objenesis:objenesis:jar:2.1:compile
  [INFO] |     \- com.cedarsoftware:java-util:jar:1.9.0:compile
  [INFO] |        \- com.cedarsoftware:json-io:jar:2.5.1:compile
  [INFO] +- de.ruedigermoeller:kontraktor-http:jar:3.33:compile
  [INFO] |  +- io.github.lukehutch:fast-classpath-scanner:jar:1.2.3:compile
  [INFO] |  +- org.apache.httpcomponents:httpasyncclient:jar:4.1:compile
  [INFO] |  |  +- org.apache.httpcomponents:httpcore:jar:4.4.1:compile
  [INFO] |  |  +- org.apache.httpcomponents:httpcore-nio:jar:4.4.1:compile
  [INFO] |  |  +- org.apache.httpcomponents:httpclient:jar:4.4.1:compile
  [INFO] |  |  |  \- commons-codec:commons-codec:jar:1.9:compile
  [INFO] |  |  \- commons-logging:commons-logging:jar:1.2:compile
  [INFO] |  +- javax.websocket:javax.websocket-api:jar:1.1:compile
  [INFO] |  +- io.undertow:undertow-core:jar:1.2.8.Final:compile
  [INFO] |  |  +- org.jboss.logging:jboss-logging:jar:3.1.4.GA:compile
  [INFO] |  |  +- org.jboss.xnio:xnio-api:jar:3.3.1.Final:compile
  [INFO] |  |  \- org.jboss.xnio:xnio-nio:jar:3.3.1.Final:runtime
  [INFO] |  +- io.undertow:undertow-websockets-jsr:jar:1.2.8.Final:compile
  [INFO] |  |  +- io.undertow:undertow-servlet:jar:1.2.8.Final:compile
  [INFO] |  |  |  +- org.jboss.spec.javax.servlet:jboss-servlet-api_3.1_spec:jar:1.0.0.Final:compile
  [INFO] |  |  |  \- org.jboss.spec.javax.annotation:jboss-annotations-api_1.2_spec:jar:1.0.0.Final:compile
  [INFO] |  |  \- org.jboss.spec.javax.websocket:jboss-websocket-api_1.1_spec:jar:1.1.0.Final:compile
  [INFO] |  +- org.slf4j:slf4j-api:jar:1.7.12:compile
  [INFO] |  \- org.jsoup:jsoup:jar:1.8.2:compile
  [INFO] +- org.apache.logging.log4j:log4j-api:jar:2.5:compile
  [INFO] +- org.apache.logging.log4j:log4j-core:jar:2.5:compile
  [INFO] +- org.quartz-scheduler:quartz:jar:2.2.3:compile
  [INFO] |  \- c3p0:c3p0:jar:0.9.1.1:compile
  [INFO] +- org.quartz-scheduler:quartz-jobs:jar:2.2.3:compile
  </code></pre>
  
  <p>So simple question, how does logback-classic get loaded, and who is loading it?</p>