問(wèn)題
在出現(xiàn)依賴的庫(kù)版本不一致的情況時(shí),gradle會(huì)默認(rèn)使用新版本覆蓋舊版本,通常不需要手動(dòng)去解決。那么出現(xiàn)沖突一般為兩個(gè)依賴屬于不同類型的配置,比如:
compile 'junit:junit:4.12' //denpends on version 1.3
androidTestCompile 'org.mockito:mockito-core:1.10.19' //denpends on version 1.1
解決方法
打印依賴樹(shù)
將依賴關(guān)系打印到日志文件中: ./gradlew -q app:dependencies > dependencies.txt,結(jié)合出錯(cuò)信息找到?jīng)_突的庫(kù),一般情況下試著將沖突的的庫(kù)升級(jí)到最新版本就可以解決問(wèn)題,通常會(huì)有版本提示,如果沒(méi)有可以在Marven中查找
防止依賴傳遞transitive = false
#關(guān)閉單個(gè)庫(kù)的傳遞依賴
api('xxx.xxx.xxx:1.1.9'){
transitive = false
}
#關(guān)閉全局傳遞依賴
configurations.all {
transitive = false
}
排除依賴exclude
相當(dāng)于更小粒度的限制傳遞依賴。exclude可以接收group和module兩個(gè)參數(shù),這兩個(gè)參數(shù)可以單獨(dú)使用也可以搭配使用
// group :module:version
android.arch.lifecycle:runtime:1.1.1
dependencies {
#測(cè)試時(shí)發(fā)現(xiàn)exclude在dependencies中單獨(dú)為某一個(gè)庫(kù)設(shè)置沒(méi)辦法正常工作
# compile("pkaq.tiger:web:1.0") {
# exclude module: 'share'
# }
#}
#推薦使用configurations來(lái)配置
configurations {
//編譯期排除commons模塊
compile.exclude module: 'commons'
//在整個(gè)構(gòu)建過(guò)程中排除pkaq.tiger:share
all*.exclude group: 'pkaq.tiger', module: 'share'
}
使用場(chǎng)景:
- 依賴沖突時(shí),如果有兩個(gè)依賴引用了相同jar包的不同版本時(shí),默認(rèn)情況下gradle會(huì)采用最新版本的jar包,此時(shí)可以通過(guò)排除選項(xiàng)來(lái)排除。
- 運(yùn)行期無(wú)需此模塊的。
- 無(wú)法正常獲取到此傳遞依賴,遠(yuǎn)程倉(cāng)庫(kù)都不存在的。
- 版權(quán)原因需要排除的。
- 其他原因。
使用強(qiáng)制版本force
當(dāng)然,有時(shí)候你可能僅僅是需要強(qiáng)制使用某個(gè)統(tǒng)一的依賴版本,而不是排除他們,那么此時(shí)force就該登場(chǎng)了。指定force = true屬性可以沖突時(shí)優(yōu)先使用該版本進(jìn)行解決。
#測(cè)試無(wú)效
#compile('org.hibernate:hibernate:3.1') {
# force = true
#}
#全局配置
configurations.all {
resolutionStrategy.force 'com.google.guava:guava:18.0'
}
使用動(dòng)態(tài)版本
如果你想讓你的工程始終采用最新依賴,那么Gradle提供了一種方式可以始終保證采用依賴的最新版本而無(wú)需每次手工檢查修改版本。使用加號(hào)+,可以讓Gradle在每次執(zhí)行構(gòu)建時(shí)檢查遠(yuǎn)程倉(cāng)庫(kù),如果存在新版本則下載選用最新版本。
當(dāng)然也可以指定依賴某個(gè)大版本下的最新子版本,1.+表示始終采用該依賴最新的1.x版本的最新依賴。
compile 'org.springframework:spring-web:+'
雖然這是看上去十分風(fēng)騷的一種用法,但這無(wú)疑會(huì)降低你系統(tǒng)構(gòu)建的速度同時(shí)提高構(gòu)建失敗的風(fēng)險(xiǎn)。因?yàn)镚radle不得不每次檢查遠(yuǎn)程倉(cāng)庫(kù)是否存在最新版本,同時(shí)新版本也可能帶來(lái)無(wú)法預(yù)知的兼容性問(wèn)題,比如quartz2.x較之于quartz1.x,common-lang3較之于common-lang等。
綜合示例
compile('org.hibernate:hibernate:3.1') {
// 沖突時(shí)優(yōu)先使用該版本
force = true
// 依據(jù)構(gòu)建名稱排除
exclude module: 'cglib'
// 依據(jù)組織名稱排除
exclude group: 'org.jmock'
// 依據(jù)組織名稱+構(gòu)件名稱排除
exclude group: 'org.unwanted', module: 'iAmBuggy'
// 為本依賴關(guān)閉依賴傳遞特性
transitive = false
}
參考文章:
https://blog.csdn.net/pkaq_/article/details/53906668
http://www.itdecent.cn/p/9b6d71e3c6fd