1. Gambaran keseluruhan
Apabila kita menggunakan SLF4J dalam aplikasi kita, kadang-kadang kita melihat mesej amaran mengenai banyak pengikatan di classpath yang dicetak ke konsol.
Dalam tutorial ini, kami akan cuba memahami mengapa kami melihat mesej ini dan bagaimana menyelesaikannya.
2. Memahami Peringatan
Pertama, mari lihat contoh amaran:
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]
Amaran ini memberitahu bahawa SLF4J telah menemui dua ikatan. Satu di slf4j-log4j12-1.7.21.jar dan yang lain di logback-classic-1.1.7.jar .
Sekarang, mari kita fahami mengapa kita melihat amaran ini.
Simple Logging Facade untuk Java (SLF4J) berfungsi sebagai fasad atau abstraksi sederhana untuk pelbagai kerangka pembalakan. Oleh itu, ia membolehkan kita memasukkan kerangka pembalakan yang kita inginkan pada waktu penggunaan.
Untuk mencapainya, SLF4J mencari penjilidan (aka penyedia) di classpath. Pengikatan pada dasarnya adalah pelaksanaan kelas SLF4J tertentu yang dimaksudkan untuk diperluas untuk memasukkan kerangka pembalakan tertentu.
Dengan reka bentuk, SLF4J hanya akan mengikat dengan satu kerangka pembalakan pada satu masa. Akibatnya, jika terdapat lebih dari satu pengikatan di lorong kelas, ia akan mengeluarkan amaran .
Perlu diperhatikan bahawa komponen tertanam seperti perpustakaan atau kerangka kerja tidak boleh menyatakan pergantungan pada pengikatan SLF4J. Ini kerana apabila perpustakaan menyatakan ketergantungan waktu kompilasi pada pengikatan SLF4J, ia memaksakan pengikatan tersebut pada pengguna akhir. Jelas sekali, ini menafikan tujuan asas SLF4J. Oleh itu, mereka hanya bergantung pada perpustakaan slf4j-api .
Penting juga untuk diperhatikan bahawa ini hanya peringatan. Sekiranya SLF4J menemui banyak pengikatan, ia akan memilih satu kerangka pembalakan dari senarai dan mengikatnya. Seperti yang dapat dilihat pada baris amaran terakhir, SLF4J telah memilih Log4j dengan menggunakan org.slf4j.impl.Log4jLoggerFactory untuk mengikat sebenarnya.
3. Mencari JAR yang Bercanggah
Amaran tersebut menyenaraikan lokasi semua ikatan yang dijumpainya. Biasanya, ini adalah maklumat yang mencukupi untuk mengenal pasti kebergantungan tidak bertanggungjawab yang secara sementara menarik SLF4J yang tidak diingini ke dalam projek kami.
Sekiranya tidak dapat mengenal pasti pergantungan dari amaran, kita dapat menggunakan kebergantungan: tujuan maven tree :
mvn dependency:tree
Ini akan memaparkan pokok kebergantungan untuk projek:
[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 log masuk dalam aplikasi kami. Oleh itu, kami sengaja menambah pengikatan Logback, yang terdapat dalam JAR logback-klasik . Tetapi, kebergantungan docx4j juga telah mengikat yang lain dengan JAR slf4j-log4j12 .
4. Ketetapan
Sekarang kita tahu kebergantungan yang menyinggung perasaan, yang perlu kita lakukan adalah mengecualikan slf4j-log4j12 JAR dari ketergantungan docx4j :
org.docx4j docx4j ${docx4j.version} org.slf4j slf4j-log4j12 log4j log4j
Oleh kerana kami tidak akan menggunakan Log4j, mungkin ada baiknya mengecualikannya juga.
5. Kesimpulan
Dalam artikel ini, kami melihat bagaimana kami dapat menyelesaikan amaran yang sering dilihat mengenai banyak ikatan yang dikeluarkan oleh SLF4J.
Kod sumber yang menyertai artikel ini terdapat di GitHub.