Gradle-5.3:依賴-管理依賴的版本(傳遞(transitive)\排除(exclude)\強制(force)\動態版本(+))

什麼是傳遞依賴

  在Maven倉庫中,構件經過POM(一種XML文件)來描述相關信息以及傳遞性依賴。Gradle 能夠經過分析該文件獲取獲取因此依賴以及依賴的依賴和依賴的依賴的依賴,爲了更加直觀的表述,能夠經過下面的輸出結果瞭解。java

+--- org.springframework:spring-web:4.3.4.RELEASE
|    |    +--- org.springframework:spring-aop:4.3.4.RELEASE
|    |    +--- org.springframework:spring-beans:4.3.4.RELEASE
|    |    +--- org.springframework:spring-context:4.3.4.RELEASE
|    |    \--- org.springframework:spring-core:4.3.4.RELEASE

  能夠看到,咱們的項目依賴了spring-web,然而spirng-web卻依賴了一衆spring的全家桶,藉助Gradle的傳遞性依賴特性,你無需再你的腳本中把這些依賴都聲明一遍,你只須要簡單的一行,Gradle便會幫你將傳遞性依賴一塊兒下載下來。web

compile `org.springframework:spring-web:4.3.4.RELEASE`

 傳遞依賴特性能夠輕鬆地經過transitive參數進行開啓或關閉,上面的示例中若是要忽略spring-web的傳遞性依賴能夠採用指定 transitive = false 的方式來關閉依賴傳遞特性,也能夠採用添加@jar的方式忽略該依賴的全部傳遞性依賴。spring

compile("org.springframework:spring-web:4.3.4.RELEASE") {
    transitive = false
}

compile `org.springframework:spring-web:4.3.4.RELEASE@jar`

下面的語句,能夠全局性的關閉依賴傳遞特性。gradle

configurations.all {
   transitive = false
}

排除依賴spa

   有些時候你可能須要排除一些傳遞性依賴中的某個模塊,此時便不能靠單純的關閉依賴傳遞特性來解決了。這時exclude就該登場了,若是說@jar完全的解決了傳遞問題,那麼exclude則是部分解決了傳遞問題。然而實際上exclude肯能還會用的頻率更更頻繁一些,好比下面幾種狀況。hibernate

  • 依賴衝突時,若是有兩個依賴引用了相同jar包的不一樣版本時,默認狀況下gradle會採用最新版本的jar包,此時能夠經過排除選項來排除。
  • 運行期無需此模塊的。
  • 沒法正常獲取到此傳遞依賴,遠程倉庫都不存在的。
  • 版權緣由須要排除的。
  • 其餘緣由。

能夠經過configuration配置或者在依賴聲明時添加exclude的方式來排除指定的引用。rest

  exclude能夠接收group和module兩個參數,這兩個參數能夠單獨使用也能夠搭配使用,其中module能夠理解爲對應GAV中的artifactId,也就是compile group: 'org.gradle.test.classifiers', name: 'service', version: '1.0'中的中間name部分。code

configurations {
    //編譯期排除commons模塊
    compile.exclude module: 'commons'
    //在整個構建過程當中排除pkaq.tiger:share
    all*.exclude group: 'pkaq.tiger', module: 'share'
}

dependencies {
    compile("pkaq.tiger:web:1.0") {
        exclude module: 'share'
    }       
}

使用強制版本

  固然,有時候你可能僅僅是須要強制使用某個統一的依賴版本,而不是排除他們,那麼此時force就該登場了。指定force = true屬性能夠衝突時優先使用該版本進行解決。blog

compile('org.hibernate:hibernate:3.1') {
    force = true
}

全局配置強制使用某個版本的依賴來解決依賴衝突中出現的依賴ci

configurations.all {
   resolutionStrategy {
       force 'org.hamcrest:hamcrest-core:1.3'
   }
}

使用動態版本

  若是你想讓你的工程始終採用最新依賴,那麼Gradle提供了一種方式能夠始終保證採用依賴的最新版本而無需每次手工檢查修改版本。 
  使用加號+,可讓Gradle在每次執行構建時檢查遠程倉庫是否存在該依賴的新版本,若是存在新版本則下載選用最新版本。固然也能夠指定依賴某個大版本下的最新子版本,1.+表示始終採用該依賴最新的1.x版本的最新依賴。

compile 'org.springframework:spring-web:+'

 

雖然這是看上去十分風騷的一種用法,但這無疑會下降你係統構建的速度同時提升構建失敗的風險。由於Gradle不得不每次檢查遠程倉庫是否存在最新版本,同時新版本也可能帶來沒法預知的兼容性問題,好比quartz2.x較之於quartz1.x,common-lang3較之於common-lang等。

 

一個綜合示例

compile('org.hibernate:hibernate:3.1') {
 // 衝突時優先使用該版本
 force = true

 // 依據構建名稱排除
 exclude module: 'cglib' 
 // 依據組織名稱排除
 exclude group: 'org.jmock' 
 // 依據組織名稱+構件名稱排除
 exclude group: 'org.unwanted', module: 'iAmBuggy' 

 // 爲本依賴關閉依賴傳遞特性
 transitive = false
}
相關文章
相關標籤/搜索