Upozorenje SLF4J: Put klase sadrži više SLF4J veza

1. Pregled

Kada koristimo SLF4J u našim aplikacijama, ponekad vidimo poruku upozorenja o višestrukim vezama na putu predavanja ispisanim na konzoli.

U ovom ćemo uputstvu pokušati razumjeti zašto vidimo ovu poruku i kako je riješiti.

2. Razumijevanje upozorenja

Prvo, pogledajmo primjer upozorenja:

SLF4J: Put klase sadrži višestruke SLF4J veze. SLF4J: Pronađeno je povezivanje u [jar: file: ... / slf4j-log4j12-1.7.21.jar! /Org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Pronađeno je povezivanje u [jar: file: ... / logback -classic-1.1.7.jar! /org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Objašnjenje potražite u //www.slf4j.org/codes.html#multiple_bindings. SLF4J: Stvarno je vezivanje tipa [org.slf4j.impl.Log4jLoggerFactory]

Ovo upozorenje govori nam da je SLF4J pronašao dvije veze. Jedan je unutra slf4j-log4j12-1.7.21.jar a druga u prijava-klasika-1.1.7.jar.

Sada, shvatimo zašto vidimo ovo upozorenje.

Jednostavna fasada bilježenja za Javu (SLF4J) služi kao jednostavna fasada ili apstrakcija za različite okvire bilježenja. Dakle, omogućuje nam uključivanje željenog okvira za evidentiranje u vrijeme postavljanja.

Da bi to postigao, SLF4J traži vezivanja (ili dobavljače) na stazi predavanja. Vezi su u osnovi implementacije određene klase SLF4J namijenjene proširivanju radi uključivanja u određeni okvir zapisivanja.

Prema dizajnu, SLF4J će se istovremeno povezivati ​​samo s jednim okvirom za bilježenje. Slijedom toga, ako je na putu predavanja prisutno više od jednog vezivanja, emitirat će upozorenje.

Vrijedno je napomenuti da ugrađene komponente kao što su knjižnice ili okviri nikada ne bi trebale objavljivati ​​ovisnost o bilo kojem SLF4J vezanju. To je zato što kada knjižnica proglasi ovisnost o vremenu kompajliranja o vezanju SLF4J, to nameće krajnjem korisniku. Očito, ovo negira osnovnu svrhu SLF4J. Slijedom toga, oni bi trebali ovisiti samo o slf4j-api knjižnica.

Također je važno da imajte na umu da je ovo samo upozorenje. Ako SLF4J pronađe više veza, na popisu će odabrati jedan okvir za prijavu i povezati se s njim. Kao što se može vidjeti u posljednjem retku upozorenja, SLF4J je odabrao Log4j pomoću org.slf4j.impl.Log4jLoggerFactory za stvarno povezivanje.

3. Pronalaženje sukobljenih JAR-ova

Upozorenje navodi mjesta svih veza koje pronađe. To su obično dovoljne informacije za identificiranje beskrupulozne ovisnosti koja tranzitivno uvlači neželjeni SLF4J vez u naš projekt.

Ako iz upozorenja nije moguće utvrditi ovisnost, možemo upotrijebiti ovisnost: stablo maven cilj:

mvn ovisnost: stablo

Ovo će prikazati stablo ovisnosti za projekt:

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

Za prijavu u našu aplikaciju koristimo Logback. Stoga smo dodali obvezujuću prijavu prisutnu u prijava-klasična JAR, namjerno. Ali docx4j ovisnost je povukla još jedno povezivanje s slf4j-log4j12 JAR.

4. Razlučivost

Sad kad znamo ovisnost o prijestupima, sve što trebamo učiniti je isključiti slf4j-log4j12 JAR iz docx4j ovisnost:

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

Budući da nećemo koristiti Log4j, možda bi bilo dobro i njega isključiti.

5. Zaključak

U ovom smo članku vidjeli kako možemo riješiti često viđeno upozorenje o višestrukim vezama koje emitira SLF4J.

Izvorni kod koji prati ovaj članak dostupan je na GitHubu.