Peringatan SLF4J: Jalur Kelas Berisi Beberapa Binding SLF4J

1. Ikhtisar

Saat kami menggunakan SLF4J dalam aplikasi kami, terkadang kami melihat pesan peringatan tentang beberapa binding di classpath yang dicetak ke konsol.

Dalam tutorial ini, kami akan mencoba memahami mengapa kami melihat pesan ini dan cara mengatasinya.

2. Memahami Peringatan

Pertama, mari kita lihat contoh peringatan:

SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:.../slf4j-log4j12-1.7.21.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:.../logback-classic-1.1.7.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See //www.slf4j.org/codes.html#multiple_bindings for an explanation. SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]

Peringatan ini memberi tahu kita bahwa SLF4J telah menemukan dua binding. Satu di slf4j-log4j12-1.7.21.jar dan yang lainnya di logback-classic-1.1.7.jar .

Sekarang, mari kita pahami mengapa kita melihat peringatan ini.

Fasad Logging Sederhana untuk Java (SLF4J) berfungsi sebagai fasad atau abstraksi sederhana untuk berbagai kerangka kerja logging. Dengan demikian, ini memungkinkan kami untuk memasang kerangka kerja logging yang kami inginkan pada waktu penerapan.

Untuk mencapai ini, SLF4J mencari binding (alias penyedia) di classpath. Binding pada dasarnya adalah implementasi dari kelas SLF4J tertentu yang dimaksudkan untuk diperluas untuk dihubungkan dengan kerangka kerja logging tertentu.

Secara desain, SLF4J hanya akan mengikat dengan satu kerangka kerja logging pada satu waktu. Akibatnya, jika ada lebih dari satu binding di classpath, peringatan akan dikeluarkan .

Perlu dicatat bahwa komponen yang disematkan seperti pustaka atau kerangka kerja tidak boleh mendeklarasikan ketergantungan pada pengikatan SLF4J apa pun. Ini karena ketika pustaka mendeklarasikan ketergantungan waktu kompilasi pada pengikatan SLF4J, itu memberlakukan pengikatan itu pada pengguna akhir. Jelas, ini meniadakan tujuan dasar SLF4J. Akibatnya, mereka hanya harus bergantung pada pustaka slf4j-api .

Penting juga untuk dicatat bahwa ini hanyalah peringatan. Jika SLF4J menemukan beberapa binding, SLF4J akan memilih satu framework logging dari daftar dan mengikatnya. Seperti yang dapat dilihat di baris terakhir peringatan, SLF4J telah memilih Log4j dengan menggunakan org.slf4j.impl.Log4jLoggerFactory untuk pengikatan sebenarnya.

3. Menemukan JAR yang Bertentangan

Peringatan mencantumkan lokasi semua binding yang ditemukannya. Biasanya, ini adalah informasi yang cukup untuk mengidentifikasi ketergantungan yang tidak bermoral yang secara sementara menarik pengikatan SLF4J yang tidak diinginkan ke dalam proyek kami.

Jika tidak memungkinkan untuk mengidentifikasi ketergantungan dari peringatan, kita bisa menggunakan ketergantungan: tree maven goal:

mvn dependency:tree

Ini akan menampilkan pohon ketergantungan untuk proyek:

[INFO] +- org.docx4j:docx4j:jar:3.3.5:compile [INFO] | +- org.slf4j:slf4j-log4j12:jar:1.7.21:compile [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:compile 

Kami menggunakan Logback untuk masuk ke aplikasi kami. Karenanya, kami telah menambahkan pengikatan Logback, hadir di JAR logback klasik , dengan sengaja. Namun, ketergantungan docx4j juga telah menarik pengikatan lain dengan JAR slf4j-log4j12 .

4. Resolusi

Sekarang setelah kita mengetahui ketergantungan yang menyinggung, yang perlu kita lakukan adalah mengecualikan JAR slf4j-log4j12 dari ketergantungan docx4j :

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

Karena kita tidak akan menggunakan Log4j, mungkin ada baiknya untuk mengecualikannya juga.

5. Kesimpulan

Dalam artikel ini, kami melihat bagaimana kami dapat menyelesaikan peringatan yang sering terlihat tentang beberapa binding yang dipancarkan oleh SLF4J.

Kode sumber yang menyertai artikel ini tersedia di GitHub.