Gradle 入門-版本衝突問題
本文作者:黃少存,叩丁狼高階講師。原創文章,轉載請註明出處。
在之前的文章上,咱們已經知道了如何新增依賴,接下來咱們來看下如何來管理依賴.其實管理依賴的最重要的環節就是傳遞性依賴過程中存在的版本衝突的問題處理.接下來咱們先來看個存在傳遞性依賴過程中 jar 測版本衝突問題,再來看下 Gradle 有哪些的處理方法.
傳遞性依賴中的版本衝突
hibernate中slf4j的版本衝突問題
上圖咱們可以知道,咱們需要依賴 hibernate3.6.3 的版本,而此版本需要依賴幾個 jar 包,而依賴的 hibernate-commons-annotations.jar 依賴了一個slf4j 的jar包,當前hibernate框架也依賴了slf4j 的 jar 包.由於傳遞性依賴的特點,兩個不同版本的 jar 包會被依賴進來,這樣就存在版本衝突的問題.
存在版本衝突問題是需要解決的,如果沒有解決程式就會出問題,那咱們使用 Gradle 做依賴管理,要如何來解決此問題? Gradle 有沒有幫咱們解決此問題? 請繼續往下看版本衝突的解決方案.
版本衝突解決方法
對於 Maven 的自動處理傳遞性依賴版本衝突問題,是按最短路徑和優先宣告原則來處理.
Maven自動解決版本衝突原則
而對於 Gradle 來說同樣有著自動處理傳遞性依賴版本衝突問題的功能,只是 Gradle 是預設使用版本最高的.而針對一些特殊的需求還是需要使用手動解決.以下便是 Gradle 的手動處理版本衝突.
1 修改預設配置策略
如果想檢查有哪些 jar 包有版本衝突,或者想去除 Gradle 的預設處理方式,可修改預設的配置策略.
- 1 在 build.gradle 中加入如下配置
configurations.all{
resolutionStrategy{
// 修改 gradle不自動處理版本衝突
failOnVersionConflict()
}
}
- 2 執行 help -> dependencies 可檢視衝突的 jar 包
A conflict was found between the following modules: - org.slf4j:slf4j-api:1.6.1 - org.slf4j:slf4j-api:1.5.8
以上配置完,如果存在依賴 jar 包版本衝突問題, Gradle 將不再自動處理,build 會拋異常.
2 排除傳遞性依賴
- 排除單個jar 包的傳遞性依賴
dependencies {
compile (group: 'org.hibernate', name: 'hibernate-core', version: '3.6.3.Final'){
// module 是 jar 的 name
exclude group:"org.slf4j" , module:"slf4j-api"
}
}
此處的 module 指的是 jar 的 name,值無需寫版本,此配置的意義就是排序 hibernate-core 引入時 slf4f-api 的傳遞性依賴.也就是說咱們的專案目前沒有依賴任何版本的 slf4f-api.
- 排除所有 jar 的傳遞性依賴
dependencies {
compile (group: 'org.hibernate', name: 'hibernate-core', version: '3.6.3.Final'){
transitive=false
}
}
transitive 預設為true ,表示 Gradle 自動新增子依賴項,設定為false 則需要手動新增每個依賴項,在真實開發中,需要自動新增子依賴的比較多,而手動新增的比較少,畢竟使用工具的主要目的是減少工作量嘛,所以開發中此配置建議不使用.
3 強制指定一個版本
給有衝突的 jar 包強制指定一個版本,在 build.gradle 中配置如下
configurations.all{
resolutionStrategy{
force 'org.slf4j:slf4j-api:1.7.24'
}
}
執行 help -> dependencies 可看到所有的 slf4j 都改為了1.7.24 的版本了.
以上便是 Gradle 在傳遞性依賴中的版本衝突問題的預設解決方式介紹和如何手動解決版本衝突的兩種方案.
至此咱們已經掌握瞭如何使用 Gradle 配置依賴和管理依賴,下一篇咱們就來做個小實踐.期待<<Gradle 的多專案構建>>
想獲取更多技術視訊,請前往叩丁狼官網:http://www.wolfcode.cn/all_article.html