1.出現問題
錯誤如下:
SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/D:/Users/FFprincess/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/D:/Users/FFprincess/.m2/repository/org/slf4j/slf4j-log4j12/1.7.25/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]
說明這是maven問題,兩者衝突。
錯誤如下:
SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/usr/hbase/lib/slf4j-log4j12-1.6.4.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/usr/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
說明這是jar包衝突,分別爲:
file:/usr/hbase/lib/slf4j-log4j12-1.6.4.jar!/org/slf4j/impl/StaticLoggerBinder.class
/usr/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class
2. 錯誤原因
出現這種問題的根本原因是項目中確實存在了多個slf4j的綁定。這是毋庸置疑的。
但問題是,在我們項目中的幾個模塊裏的pom文件都沒有聲明引用log4j,只聲明瞭logback的引用,爲什麼slf4j還會找到兩個綁定?
答案肯定是:既然你沒有顯式引用,那肯定是在哪個地方偷偷地引用了啊。你通過maven座標引用的jar包裏,肯定有衝突的jar包。
如下圖所示。在我們的這個項目中,在core模塊添加如下座標。
<dependencies> <dependency> <groupId>com.github.wenweihu86.raft</groupId> <artifactId>raft-java-core</artifactId> <version>1.8.0</version> </dependency> </dependencies>
這個座標。它裏面就含有了log4j的jar包,因爲這個項目打包發佈的時候,把slf4j的具體綁定一同打包了。
3.解決辦法:
在上面的座標里加上 <exclusions> 標籤。該標籤顧名思義就是排除一些東西。
<!--exclude log4j in raft-brpc-core--> <exclusions> <exclusion> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> </exclusion> <exclusion> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> </exclusion> </exclusions>
由上圖可以看出,將需要排除的jar包的maven座標放進去之後,maven會自動將這些jar包從當前項目移除。
啓動項目,控制檯打印前後對比圖:
前:
後:
知識點延伸:
slf4j是日誌門面,外觀,抽象,接口。log4j,logback是具體實現。
參考:
https://blog.csdn.net/weixin_42181264/article/details/112168270
https://blog.csdn.net/sinat_32336967/article/details/98531470
https://blog.csdn.net/sunzixiao/article/details/126256484