2017-11-01 1 views
2

Während mit dem Protokollierung Abhängigkeiten zu experimentieren, hatte ich die folgende Situation:slf4j/logback/jcl-über-slf4j - noch Routing zu Logback, auch wenn jcl-over-slf4j nicht in Abhängigkeiten ist?

<repositories> 
    <repository> 
     <id>version99</id> 
     <url>http://version99.qos.ch/</url> 
    </repository> 
</repositories> 

<dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>commons-logging</groupId> 
      <artifactId>commons-logging</artifactId> 
      <version>99-empty</version> 
     </dependency> 
    </dependencies> 
</dependencyManagement> 

<dependencies> 
    <dependency> 
     <groupId>commons-logging</groupId> 
     <artifactId>commons-logging</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>1.7.25</version> 
    </dependency> 
    <!--<dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>jcl-over-slf4j</artifactId> 
     <version>1.7.25</version> 
    </dependency>--> 
    <dependency> 
     <groupId>ch.qos.logback</groupId> 
     <artifactId>logback-core</artifactId> 
     <version>1.2.3</version> 
    </dependency> 
    <dependency> 
     <groupId>ch.qos.logback</groupId> 
     <artifactId>logback-classic</artifactId> 
     <version>1.2.3</version> 
    </dependency> 
</dependencies> 

Es ist wichtig, dass die Abhängigkeit zu jcl-over-slf4j zu beachten ist als Kommentar gekennzeichnet. Zu meiner Überraschung wurden die Logs von Spring noch von Logback verarbeitet. Wie ist das möglich? Zwischen jcl und slf4j ist keine Bridge aktiv. Wie können wir also im Logback landen? Ich

Nachweis erbracht, dass:

  • Nur commons-logging-99-empty.jar in Classpath ist.
  • jcl-over-slf4j Nein in mvn dependency:tree -Dverbose -Dincludes=org.slf4j

erwähnt wird, bin ich wirklich verwirrt. Ich erwartete NoClassDefFoundError ist auf Klassen von commons-logging.

Bitte beachten Sie, dass ich keine Absicht habe, diese Abhängigkeit zu jcl-over-slf4j in Kommentaren zu verlassen. Ich möchte nur verstehen, was vor sich geht. Ich dachte, ich würde diese Logging-Abhängigkeiten endlich verstehen, aber anscheinend verhält es sich in der Praxis völlig anders, als ich erwartet hatte.

+0

Einloggen Java = PITA. Nur Spaß, es ist schön. – Jessy56

Antwort

10

Verwenden Sie Spring 5?

Im Frühjahr 5 wird eine weitere so genannte Brücke eingeführt: spring-jcl. Siehe https://jira.spring.io/browse/SPR-14512 für Entwicklungshinweise.

Also in Ihrem Fall, während jcl-over-slf4j nicht mehr in der Classpath war, ist spring-jcl noch und es genau das Gleiche (und ein bisschen mehr tut, als es Routen auch commons-logging-log4j oder java.util.logging, je nachdem, was ist auf Ihrem Klassenpfad) als jcl-over-slf4j. Wenn Sie sowohl jcl-over-slf4j als auch spring-jcl haben, ist es grundsätzlich undefiniert, wer gewinnt. Das ist in Ordnung, da beide das Gleiche machen. Sie haben jedoch überlappende Klassen, so dass Sie möglicherweise woanders beißen.

Das ist Logging Terror vom Feinsten.

Verwandte Themen