SLF4J Waarschuwing: Klassepad bevat meerdere SLF4J-bindingen

1. Overzicht

Wanneer we SLF4J gebruiken in onze applicaties, zien we soms een waarschuwingsbericht over meerdere bindingen in het klassenpad dat naar de console wordt afgedrukt.

In deze tutorial zullen we proberen te begrijpen waarom we dit bericht zien en hoe we het kunnen oplossen.

2. De waarschuwing begrijpen

Laten we eerst eens kijken naar een voorbeeldwaarschuwing:

SLF4J: Klassepad bevat meerdere SLF4J-bindingen. SLF4J: binding gevonden in [jar: file: ... / slf4j-log4j12-1.7.21.jar! /Org/slf4j/impl/StaticLoggerBinder.class] SLF4J: binding gevonden in [jar: file: ... / logback -classic-1.1.7.jar! /org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Zie //www.slf4j.org/codes.html#multiple_bindings voor een uitleg. SLF4J: Werkelijke binding is van het type [org.slf4j.impl.Log4jLoggerFactory]

Deze waarschuwing vertelt ons dat SLF4J twee bindingen heeft gevonden. Een daarvan is binnen slf4j-log4j12-1.7.21.jar en de andere in logback-classic-1.1.7.jar.

Laten we nu begrijpen waarom we deze waarschuwing zien.

De Simple Logging Facade for Java (SLF4J) dient als een simpele gevel of abstractie voor verschillende logging frameworks. Het stelt ons dus in staat om tijdens de implementatie ons gewenste logging-framework in te pluggen.

Om dit te bereiken, zoekt SLF4J naar bindingen (ook bekend als providers) op het klassenpad. Bindingen zijn in feite implementaties van een bepaalde SLF4J-klasse die bedoeld zijn om te worden uitgebreid om in een specifiek logboekregistratieframework te worden aangesloten.

Door het ontwerp zal SLF4J slechts met één logboekregistratieframework tegelijk binden. Bijgevolg, als er meer dan één binding aanwezig is op het klassenpad, zal het een waarschuwing geven.

Het is vermeldenswaard dat embedded componenten zoals bibliotheken of frameworks nooit een afhankelijkheid van een SLF4J-binding mogen verklaren. Dit komt doordat wanneer een bibliotheek een compilatietijdafhankelijkheid van een SLF4J-binding declareert, het die binding oplegt aan de eindgebruiker. Dit doet duidelijk afbreuk aan het basisdoel van SLF4J. Daarom moeten ze alleen afhankelijk zijn van de slf4j-api bibliotheek.

Het is ook belangrijk om merk op dat dit slechts een waarschuwing is. Als SLF4J meerdere bindingen vindt, zal het één logboekregistratie-framework uit de lijst kiezen en eraan binden. Zoals te zien is op de laatste regel van de waarschuwing, heeft SLF4J Log4j gekozen met behulp van org.slf4j.impl.Log4jLoggerFactory voor de daadwerkelijke binding.

3. De conflicterende JAR's vinden

De waarschuwing geeft de locaties van alle gevonden bindingen weer. Gewoonlijk is dit voldoende informatie om de gewetenloze afhankelijkheid te identificeren die tijdelijk een ongewenste SLF4J-binding naar ons project trekt.

Als het niet mogelijk is om de afhankelijkheid van de waarschuwing te identificeren, kunnen we de afhankelijkheid: boom maven doel:

mvn-afhankelijkheid: boom

Dit zal de afhankelijkheidsboom voor het project weergeven:

[INFO] + - org.docx4j: docx4j: jar: 3.3.5: compileren [INFO] | + - org.slf4j: slf4j-log4j12: jar: 1.7.21: compileren [INFO] | + - log4j: log4j: jar: 1.2.17: compileren [INFO] + - ch.qos.logback: logback-classic: jar: 1.1.7: compileren [INFO] + - ch.qos.logback: logback-core: jar: 1.1.7: compileren 

We gebruiken Logback om in te loggen in onze applicatie. Daarom hebben we de Logback-binding toegevoegd, aanwezig in het logback-classic JAR, met opzet. Maar de docx4j afhankelijkheid heeft ook een andere binding met de slf4j-log4j12 POT.

4. Resolutie

Nu we de gewraakte afhankelijkheid kennen, hoeven we alleen de slf4j-log4j12 JAR van de docx4j afhankelijkheid:

 org.docx4j docx4j $ {docx4j.version} org.slf4j slf4j-log4j12 log4j log4j 

Aangezien we Log4j niet gaan gebruiken, is het misschien een goed idee om het ook uit te sluiten.

5. Conclusie

In dit artikel hebben we gezien hoe we de vaak voorkomende waarschuwing over meerdere bindingen die door SLF4J worden uitgezonden, kunnen oplossen.

De broncode die bij dit artikel hoort, is beschikbaar op GitHub.