什么是傳遞依賴
在Maven倉庫中,構件通過POM(一種XML文件)來描述相關信息以及傳遞性依賴。Gradle 可以通過分析該文件獲取獲取所以依賴以及依賴的依賴和依賴的依賴的依賴,為了更加直觀的表述,可以通過下面的輸出結果了解。
+--- 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便會幫你將傳遞性依賴一起下載下來。
compile `org.springframework:spring-web:4.3.4.RELEASE`
傳遞依賴特性可以輕松地通過transitive參數進行開啟或關閉,上面的示例中如果要忽略spring-web
的傳遞性依賴可以采用指定 transitive = false
的方式來關閉依賴傳遞特性,也可以采用添加@jar
的方式忽略該依賴的所有傳遞性依賴。
compile("org.springframework:spring-web:4.3.4.RELEASE") {
transitive = false
}
compile `org.springframework:spring-web:4.3.4.RELEASE@jar`
下面的語句,可以全局性的關閉依賴傳遞特性。
configurations.all { transitive = false }
排除依賴
有些時候你可能需要排除一些傳遞性依賴中的某個模塊,此時便不能靠單純的關閉依賴傳遞特性來解決了。這時exclude
就該登場了,如果說@jar
徹底的解決了傳遞問題,那么exclude
則是部分解決了傳遞問題。然而實際上exclude
肯能還會用的頻率更更頻繁一些,比如下面幾種情況。
- 依賴沖突時,如果有兩個依賴引用了相同jar包的不同版本時,默認情況下gradle會采用最新版本的jar包,此時可以通過排除選項來排除。
- 運行期無需此模塊的。
- 無法正常獲取到此傳遞依賴,遠程倉庫都不存在的。
- 版權原因需要排除的。
- 其他原因。
可以通過configuration配置或者在依賴聲明時添加exclude
的方式來排除指定的引用。
exclude可以接收group和module兩個參數,這兩個參數可以單獨使用也可以搭配使用,其中module可以理解為對應GAV中的artifactId,也就是compile group: 'org.gradle.test.classifiers', name: 'service', version: '1.0'
中的中間name部分。
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
屬性可以沖突時優先使用該版本進行解決。
compile('org.hibernate:hibernate:3.1') { force = true }
全局配置強制使用某個版本的依賴來解決依賴沖突中出現的依賴
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 }