在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
能夠經過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 }