SLF4J: Class path contains multiple SLF4J bindings.錯誤解決

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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章