Varovanie SLF4J: Cesta triedy obsahuje viac väzieb SLF4J

1. Prehľad

Keď v našich aplikáciách používame SLF4J, niekedy sa zobrazí varovná správa o viacerých väzbách v ceste triedy vytlačenej na konzolu.

V tejto príručke sa pokúsime pochopiť, prečo sa nám zobrazuje táto správa a ako ju vyriešiť.

2. Pochopenie varovania

Najprv sa pozrime na ukážkové varovanie:

SLF4J: Cesta triedy obsahuje viac väzieb SLF4J. SLF4J: Nájdená väzba v [jar: súbor: ... / slf4j-log4j12-1.7.21.jar! /Org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Nájdená väzba v [jar: súbor: ... / logback -classic-1.1.7.jar! /org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Vysvetlenie nájdete na stránke //www.slf4j.org/codes.html#multiple_bindings. SLF4J: Skutočná väzba je typu [org.slf4j.impl.Log4jLoggerFactory]

Toto varovanie nám hovorí, že SLF4J našiel dve väzby. Jeden je v slf4j-log4j12-1.7.21.jar a druhý v logback-classic-1.1.7.jar.

Poďme teda pochopiť, prečo vidíme toto varovanie.

Simple Logging Facade for Java (SLF4J) slúži ako jednoduchá fasáda alebo abstrakcia pre rôzne rámce protokolovania. Umožňuje nám to teda zapojiť požadovaný rámec protokolovania v čase nasadenia.

Aby to bolo možné dosiahnuť, SLF4J hľadá väzby (tiež známe ako poskytovatelia) na ceste triedy. Viazania sú v podstate implementácie konkrétnej triedy SLF4J, ktoré sa majú rozšíriť tak, aby pripojili konkrétny rámec protokolovania.

Podľa návrhu bude SLF4J viazaný iba s jedným protokolovým rámcom súčasne. V dôsledku toho ak je na triednej ceste viac ako jedna väzba, vydá varovanie.

Stojí za zmienku, že vložené komponenty, ako sú knižnice alebo rámce, by nikdy nemali deklarovať závislosť od akejkoľvek väzby SLF4J. Je to tak preto, lebo keď knižnica deklaruje závislosť kompilácie na väzbe SLF4J, uloží túto väzbu koncovému používateľovi. Je zrejmé, že to neguje základný účel SLF4J. Z tohto dôvodu by mali závisieť iba od: slf4j-api knižnica.

Je to tiež dôležité upozorňujeme, že toto je iba varovanie. Ak SLF4J nájde viac väzieb, vyberie jeden protokolovací rámec zo zoznamu a spojí sa s ním. Ako je vidieť na poslednom riadku varovania, SLF4J si vybral Log4j pomocou org.slf4j.impl.Log4jLoggerFactory pre skutočnú väzbu.

3. Nájdenie konfliktných JAR

Varovanie uvádza zoznam všetkých nájdených väzieb. Zvyčajne je to dostatočná informácia na identifikáciu bezohľadnej závislosti, ktorá prechodne vťahuje do nášho projektu nežiaduce viazanie SLF4J.

Ak nie je možné zistiť závislosť podľa varovania, môžeme použiť závislosť: strom cieľ maven:

závislosť mvn: strom

Zobrazí sa strom závislostí projektu:

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

Na prihlásenie do našej aplikácie používame Logback. Preto sme pridali väzbu Logback, ktorá sa nachádza v logback-classic JAR, zámerne. Ale docx4j závislosť tiež natiahla ďalšie viazanie s slf4j-log4j12 JAR.

4. Uznesenie

Teraz, keď poznáme závislú závislosť, stačí, ak vylúčime slf4j-log4j12 JAR z docx4j závislosť:

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

Pretože nebudeme používať Log4j, je dobré vylúčiť ho tiež.

5. Záver

V tomto článku sme videli, ako môžeme vyriešiť často viditeľné varovanie o viacnásobných väzbách emitovaných SLF4J.

Zdrojový kód, ktorý je priložený k tomuto článku, je k dispozícii na serveri GitHub.


$config[zx-auto] not found$config[zx-overlay] not found