在一次項(xiàng)目的調(diào)試中發(fā)現(xiàn)了log4j-over-slf4j.jar 和 slf4j-log4j12.jar 兩個jar包存在沖突,于是根據(jù)這個問題突引發(fā)出如何解決jar包沖突的方法椎组。
首先先還原這個異常:
- 在pom文件中引入奋献,log4j-over-slf4j 和 slf4j-log4j12案训,如下:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
<version>1.7.21</version>
</dependency>
- 然后寫一個測試類:
public class DetectedBothLog {
private static Logger logger = LoggerFactory.getLogger(DetectedBothLog.class);
public static void main(String[] args) {
logger.debug("hello, this is a log demo");
}
}
運(yùn)行后異常如下:
很明顯可以看到是jar沖突店枣,為什么這兩個jar會沖突了速警,并且導(dǎo)致的還是堆棧溢出叹誉?
在slf4j的官網(wǎng)中其實(shí)已經(jīng)給出了解釋:鏈接。意思是:slf4j-log4j12模塊的目的是將對SLF4J的日志委托或重定向到log4j(大家都知道slf4j其實(shí)并不具體實(shí)現(xiàn)日志的記錄)闷旧。而同時桂对,log4j-over-slf4j模塊的目的是將log4j的日志重定向到SLF4J,那這樣一來勢必導(dǎo)致循環(huán)調(diào)用鸠匀,也就會出現(xiàn)StackOverflowError。
重點(diǎn)來了……
要解決這個問題逾柿,只需要排除 slf4j-log4j12.jar即可缀棍。但是如何找到這個jar包了?很大部分情況是机错,這個jar包并不是直接在你的工程pom文件中引入的爬范,它可能是你依賴的一個jar包,而這個依賴的jar包依賴了slf4j-log4j12.jar弱匪。那需要找到你真實(shí)依賴的jar包青瀑,然后exclustion掉。
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
那現(xiàn)在的問題是:如何找到你工程pom文件中依賴的真實(shí)jar包萧诫?通常有以下幾種方法:
第一種:假設(shè)你已經(jīng)知道需要排除的jar的groupId和artifactId
例如斥难,slf4j-log4j12.jar的groupId和artifactId分別是,org.slf4j 和 slf4j-log4j12帘饶。那這種情況下哑诊,最方面的就是執(zhí)行如下的一個命令:
mvn dependency:tree -Dverbose -Dincludes=org.slf4j: slf4j-log4j12
這樣就可以直接看到slf4j-log4j12.jar是哪個jar包依賴的了。
第二種:就是借助IDE查找
例如使用intelj idea及刻,在安裝了dependency analyzer插件后镀裤,就可以打開pom文件缴饭,然后直接搜索,最后就可以得到它是屬于哪個jar.
總結(jié):jar包沖突也是屬于程序異常的一種類型颗搂,不要忽略它。當(dāng)遇到后毁习,如何解決jar包沖突卖丸,可以用上面兩種方法,簡單直接