SLF4J figyelmeztetés: Az osztályútvonal több SLF4J kötést tartalmaz

1. Áttekintés

Amikor az SLF4J-t alkalmazzuk az alkalmazásainkban, néha figyelmeztető üzenetet látunk a konzolra kinyomtatott többszörös összerendelésről az osztályútban.

Ebben az oktatóanyagban megpróbáljuk megérteni, miért látjuk ezt az üzenetet és hogyan oldhatjuk meg.

2. A figyelmeztetés megértése

Először nézzük meg a figyelmeztetés mintáját:

SLF4J: Az osztályút több SLF4J kötést tartalmaz. SLF4J: A [jar: file: ... / slf4j-log4j12-1.7.21.jar! /Org/slf4j/impl/StaticLoggerBinder.class] kötést találtuk. -classic-1.1.7.jar! /org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Magyarázatot lásd: //www.slf4j.org/codes.html#multiple_bindings. SLF4J: A tényleges kötés típusa [org.slf4j.impl.Log4jLoggerFactory]

Ez a figyelmeztetés arról árulkodik, hogy az SLF4J két kötést talált. Az egyik bent van slf4j-log4j12-1.7.21.jar a másik pedig logback-classic-1.1.7.jar.

Most értsük meg, miért látjuk ezt a figyelmeztetést.

A Java egyszerű naplózási homlokzata (SLF4J) egyszerű homlokzatként vagy absztrakcióként szolgál a különböző naplózási keretekhez. Így lehetővé teszi számunkra, hogy a telepítéskor csatlakoztassuk a kívánt naplózási keretrendszert.

Ennek elérése érdekében az SLF4J megkeresi a kötéseket (más néven szolgáltatók) az osztályúton. A kötések alapvetően egy adott SLF4J osztály megvalósításai, amelyeket ki kell terjeszteni egy adott naplózási keretrendszer csatlakoztatására.

A kialakítás szerint az SLF4J egyszerre csak egy naplózási kerettel fog kötődni. Következésképpen, ha egynél több kötés van az osztályúton, figyelmeztetést küld.

Érdemes megjegyezni, hogy a beágyazott összetevők, például a könyvtárak vagy a keretrendszerek, soha nem jelenthetik az SLF4J kötés függőségét. Ez azért van, mert amikor egy könyvtár fordítási időfüggőséget deklarál az SLF4J kötéstől, akkor ezt kötelezővé teszi a végfelhasználó számára. Ez nyilvánvalóan tagadja az SLF4J alapvető célját. Következésképpen csak a slf4j-api könyvtár.

Az is fontos, hogy vegye figyelembe, hogy ez csak figyelmeztetés. Ha az SLF4J többféle összerendelést talál, akkor egy naplózási keretet választ ki a listából, és kötni fog vele. Amint az a figyelmeztetés utolsó sorában látható, az SLF4J a Log4j-t választotta a használatával org.slf4j.impl.Log4jLoggerFactory a tényleges kötéshez.

3. Az ütköző JAR-ok megkeresése

A figyelmeztetés felsorolja az összes megtalált kötés helyét. Általában ez elegendő információ annak a gátlástalan függőségnek az azonosításához, amely egy nem kívánt SLF4J-kötést átmenetileg behúz a projektünkbe.

Ha nem lehet azonosítani a figyelmeztetés függőségét, használhatjuk a függőség: fa maven gól:

mvn függőség: fa

Ez megjeleníti a projekt függőségfáját:

[INFO] + - org.docx4j: docx4j: jar: 3.3.5: fordítás [INFO] | + - org.slf4j: slf4j-log4j12: jar: 1.7.21: fordítás [INFO] | + - log4j: log4j: jar: 1.2.17: fordítás [INFO] + - ch.qos.logback: logback-classic: jar: 1.1.7: fordítás [INFO] + - ch.qos.logback: logback-core: jar: 1.1.7: összeáll 

A Logback alkalmazást használjuk a bejelentkezéshez alkalmazásunkban. Ezért hozzáadtuk a Logback összerendelést, amely a logback-klasszikus JAR, szándékosan. De a docx4j függőség egy másik kötést is meghúzott a slf4j-log4j12 BEFŐTTES ÜVEG.

4. Felbontás

Most, hogy ismerjük a jogsértő függőséget, mindössze annyit kell tennünk, hogy kizárjuk a slf4j-log4j12 JAR a docx4j függőség:

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

Mivel nem a Log4j-t fogjuk használni, célszerű lehet kizárni azt is.

5. Következtetés

Ebben a cikkben láttuk, hogyan oldhatjuk meg az SLF4J által kibocsátott többszörös kötésekkel kapcsolatos gyakran látott figyelmeztetést.

A cikkhez tartozó forráskód elérhető a GitHubon.