1. 程式人生 > >Gradle依賴排除

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:+'

就這樣。