Gradle依賴排除
在引用依賴時經常會有這樣的問題:某些間接引用的依賴項是不需要的;產生了依賴衝突。此時需要排除一些依賴。
下面的內容介紹了幾種在gradle中排除依賴的方式。
在dependency中排除
1 2 3 4 5 6 7 8 |
dependencies { compile('com.zhyea:ar4j:1.0') { //excluding a particular transitive dependency: exclude module: 'cglib' //by artifact name exclude group: 'org.jmock' //by group exclude group: 'org.unwanted', module: 'iAmBuggy' //by both name and group } } |
這種方式是粒度最細的,也是最為繁瑣的。此時可以考慮全域性設定。
在全域性配置中排除
全域性配置是在configuration中完成的。
1 2 3 4 |
configurations { compile.exclude module: 'cglib' all*.exclude group:'org.unwanted', module: 'iAmBuggy' } |
禁用傳遞依賴
禁用傳遞依賴需要將屬性transitive設定為false。可以在dependency中禁用傳遞依賴,也可以在configuration中全域性禁用:
1 2 3 4 5 6 7 |
compile('com.zhyea:ar4j:1.0') { transitive = false }
configurations.all { transitive = false } |
還可以在單個依賴項中使用@jar識別符號忽略傳遞依賴:
1 |
compile 'com.zhyea:ar4j:[email protected]' |
強制使用某個版本
如果某個依賴項是必需的,而又存在依賴衝突時,此時沒必要逐個進行排除,可以使用force屬性標識需要進行依賴統一。當然這也是可以全域性配置的:
1 2 3 4 5 6 7 8 9 |
compile('com.zhyea:ar4j:1.0') { force = true }
configurations.all { resolutionStrategy { force 'org.hamcrest:hamcrest-core:1.3' } } |
在打包時排除依賴
先看一個示例:
1 2 3 4 5 6 7 8 9 10 11 |
task zip(type: Zip) { into('lib') { from(configurations.runtime) { exclude '*unwanted*', '*log*' } } into('') { from jar from 'doc' } } |
程式碼表示在打zip包的時候會過濾掉名稱中包含“unwanted”和“log”的jar包。這裡呼叫的exclude方法的引數和前面的例子不太一樣,前面的引數多是map結構,這裡則是一個正則表示式字串。
也可以使用在打包時呼叫include方法選擇只打包某些需要的依賴項:
1 2 3 4 5 6 7 8 9 10 11 |
task zip(type: Zip) { into('lib') { from(configurations.runtime) { include '*ar4j*', '*spring*' } } into('') { from jar from 'doc' } } |
始終選擇最新的依賴的項
最後這個特性和排除依賴沒有什麼關係,只是順帶說一下。
在依賴項中使用加號+,可以在構建時檢查遠端倉庫是否存在該依賴的新版本,如果存在新版本則下載選用最新版本。更有用的是可以指定依賴某個大版本下的最新子版本,如1.+表示始終採用依賴的1.x序列的最新版本。
示例如下:
1 |
compile 'com.zhyea:ar4j:+' |
就這樣。