如何解決使用Gradle時出現的jar包沖突


前言

在我之前使用Gradle的博文中已經提到,Gradle對依賴的管理是比較智能的,如果有兩個包依賴於相同的包,而版本不同的時候,Gradle會進行自動的選擇,從而避免jar包的沖突。

也就是說,在理論上使用Gradle一般情況下,不會出現jar包沖突,那么為什么會有今天這篇博文呢?

Gradle可以幫你管理的是版本不同但是包相同的依賴。但是如果兩個原本就不同的依賴之間互相發生沖突,這樣的沖突Gradle就不能自動幫你完成了,因為它也不知道你需要哪一個。

 

問題描述

我這邊以我出現的沖突為例:

項目啟動的時候,在控制台出現下述錯誤

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/D:/workSoftware/gradleRepository/caches/modules-2/files-2.1/org.slf4j/slf4j-log4j12/1.7.25/110cefe2df103412849d72ef7a67e4e91e4266b4/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/D:/workSoftware/gradleRepository/caches/modules-2/files-2.1/ch.qos.logback/logback-classic/1.1.11/ccedfbacef4a6515d2983e3f89ed753d5d4fb665/logback-classic-1.1.11.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J:
Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12.jar on the class path, preempting StackOverflowError.
SLF4J: See also http://www.slf4j.org/codes.html#log4jDelegationLoop for more details.
Exception in thread "main" java.lang.ExceptionInInitializerError
    at org.slf4j.impl.StaticLoggerBinder.<init>(StaticLoggerBinder.java:72)

其中重要的部分我已經標出,顯而易見的是,log4j-over-slf4j.jar 這個包和slf4j-log4j12.jar 包出現了沖突。

這是兩個完全不一樣的包,但是也出現了沖突,Gradle沒有辦法進行處理,所以我們需要手動去處理它。

 

問題解決

首先查看所有的依賴,你可以使用gradlew -q app:dependencies命令進行查看,如果是使用idea的話,在gradle的窗口中就有這個選項,雙擊運行就可以

QQ截圖20180204111602

出現的依賴如下所示

\--- com.baidu.unbiz:fluent-validator-jsr303:1.0.9
     +--- com.baidu.unbiz:fluent-validator:1.0.9
     |    +--- org.slf4j:slf4j-api:1.7.7 -> 1.7.25
     |    \--- org.slf4j:slf4j-log4j12:1.7.7 -> 1.7.25
     |         +--- org.slf4j:slf4j-api:1.7.25
     |         \--- log4j:log4j:1.2.17
     +--- org.hibernate:hibernate-validator:5.2.1.Final -> 5.3.5.Final (*)
     +--- javax.el:javax.el-api:2.2.4
     +--- org.glassfish.web:javax.el:2.2.4
     |    \--- javax.el:javax.el-api:2.2.4
     +--- org.slf4j:slf4j-api:1.7.7 -> 1.7.25
     \--- org.slf4j:slf4j-log4j12:1.7.7 -> 1.7.25 (*)

我只是截取了部分,你需要查看所有的依賴已確定你的沖突是發生在什么位置,從而確定你需要怎么去處理

我所需要所的是排除log4j12這個依賴

所以修改gradle配置中的依賴如下所示

compile (group: 'com.baidu.unbiz', name: 'fluent-validator-jsr303', version: '1.0.9'){
exclude module: 'slf4j-log4j12'
}
然后重新啟動項目,沖突解決

 
 

總結

其實依賴沖突在很多時候gradle已經幫我們處理好了,如果真的發生上述不可預見的沖突,gradle也會給出很明確的提示。我們所要做的是冷靜分析錯誤的信息,然后進行仔細推敲處理就可以了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM