Gradle編譯依賴沖突問(wèn)題(AGPBI)

問(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,058評(píng)論 25 709
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,568評(píng)論 19 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,273評(píng)論 6 342
  • 用兩張圖告訴你,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 14,000評(píng)論 2 59
  • 迫不得已現(xiàn)在還沒(méi)有進(jìn)入夢(mèng)鄉(xiāng)。班上有位娃生病了,發(fā)著39.4度的高燒,肚子痛了幾天,難受的不行,去了醫(yī)院,吃了藥,剩...
    不吾與閱讀 272評(píng)論 0 0

友情鏈接更多精彩內(nèi)容