解決android gradle依賴中的沖突

原文地址:https://blog.mindorks.com/avoiding-conflicts-in-android-gradle-dependencies-28e4200ca235#.c49sh2v55

Gradle讓Android開發變得更簡單,只需要在build.gradle中添加一行依賴,然后所需的庫就無縫的包含項目中,但是當兩個依賴關系依賴于同一個庫的不同版本時會發生什么?請考慮以下示例:

androidTestCompile 'junit:junit:4.12' //(Depends on version 1.3)
androidTestCompile 'org.mockito:mockito-core:1.10.19' //(Depends on version 1.1)

如果兩個依賴在內部使用同一個庫的不同版本,那么哪個版本會包含在構建中呢?答案是,最高版本會包含在構建中,在聲明依賴的模塊中運行以下命令:

./gradlew dependencies

上面的命令的輸出在下面給出,清楚地表明gradle在最終構建中將hamcrest庫版本從1.1自動升級到1.3。

依賴沖突錯誤

上面的兩個依賴都是測試依賴,所以gradle能夠自動解決沖突,但是如果兩個依賴屬于不同的配置,即app和test,那么gradle會拋出一個錯誤。
考慮一下下面的代碼片段:

compile 'junit:junit:4.12' //denpends on version 1.3
androidTestCompile 'org.mockito:mockito-core:1.10.19' //denpends on version 1.1 

現在第一個依賴屬于app配置,第二個依賴屬于測試配置,當我們構建項目的時候,會出現如下的異常:


異常
異常

根據Android gradle的官方文檔,以上的錯誤原因如下:

當運行測試時,主APK和測試APK共享相同的classpath,如果主APK和測試APK使用相同的庫,但是在不同的版本時,Gradle將構建失敗,如果gradle沒有捕捉到,你的app在測試和正常云期間會表現不同的行為。

解決依賴沖突

一旦在構建中存在依賴沖突,開發人員需要決定哪個版本的庫最終包含在構建中,有許多解決沖突的方法。

  • 從依賴項中排除沖突的模塊/庫,當生命一個依賴,我們可以指定我們不需要的模塊,例如,在我們的例子中,如果我們不想要最新版本1.3,而是想要版本1.1的hamcrest庫,那么我們可以在聲明“junit”依賴時排除該模塊。
compile('junit:junit:4.12'){
  exclude group : 'org.hamcrest',module:'hamcrest-core'
}
```
最終,如果我們向包含1.3版本到構建中,我們可以從“mockito"中排除他
```
androidTestCompile('org.mockito:mockito-core:1.10.19'){
  exclude group : 'org.hamcrest',module:'hamcrest-core'
}
```
> 在真實項目中會有很多依賴項,他們會存在相同庫的沖突版本,對于每個依賴,我們都需要有exclude標記。

- 在build.gradle中顯示定義沖突的庫,這是解決沖突的一種方式,在這種情況下,我們需要明確提出我們想要包含在任何一個配置的最終構建中的庫的版本。
```
compile 'junit:junit:4.12'
androidTestCompile 'org.mockito:mockito-core:1.10.19'
androidTestCompile 'org.hamcrest:hamcrest-core:1.3'
```
如果多個依賴具有沖突版本的依賴或傳遞依賴的話,則不是從每個依賴性中排除模塊,而是可以簡單的使用期望的版本號來定義沖突依賴。
> 這種是一種更清潔的解決沖突的方法,但缺點是,當更新實際的依賴關系的時候,開發人員需要更新沖突的庫。

### 強制庫的解析
這是解決沖突的另一種方式,不是聲明一個配置,而是強制他用于所有配置。
```
android{
  configurations.all{
    resolutionStrategy.force 'org.hamcrest:hamcrest-core:1.1'
  }
}
```
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容