今天啟動開發的項目,碰到了一個日志上的bug:java.lang.NoClassDefFoundError: Could not initialize class org.slf4j.impl.StaticLoggerBinder。剛看到一臉懵。於是到網上查了一下,也有遇到類似問題的。說是要加一些依賴,但是我試了不起作用。后來看到了一篇講slf4j集成logback和log4j的文章,給我了我靈感,嘗試了一下,解決了問題。文章的地址:https://www.jianshu.com/p/9a283ca164ca
一、原因:首先我們要知道slf4j-api是日志的規范,定義了日志的接口。logback和log4j實現了該這些規范,提供了日志的支持。logback和log4j都會用到StaticLoggerBinder去創建Logger。StaticLoggerBinder需要初始化。logback和log4j都會對StaticLoggerBinder初始化。下面是StaticLoggerBinder在logback和log4j中的目錄圖:
logback
log4j
在StaticLoggerBinder初始化的時候,如果我們項目中同時存在這兩個jar包,那么StaticLoggerBinder這個類就會沖突,導致StaticLoggerBinder初始化失敗,因此造成了java.lang.NoClassDefFoundError: Could not initialize class org.slf4j.impl.StaticLoggerBinder。
我的項目默認是要使用logback來作為日志的實現的,因此logback-classic存在是很正常的。所以slf4j-log4j12這個jar的存在導致了這個問題。經查slf4j-log4j12存在於我的一個名叫dingtalk-sdk的依賴中。
二:解決
因為我的項目中要使用logback,所以我要把log4j去掉。所以我在dingtalk-sdk這個依賴中加入了exclusion。如下:
現在就可以正常啟動項目了。