本文為作者原創,轉載請注明出處:http://www.cnblogs.com/gzdaijie/p/5296624.html
目錄
1.添加依賴包名
1.1 依賴類型
1.2 聲明依賴
1.3 添加java依賴
1.4 查找依賴包名
1.5 完整的例子
2.添加依賴倉庫
3.依賴常見問題
3.1 依賴傳遞性
3.2 版本沖突
3.3 動態依賴
3.4 更多設置
開發任何軟件,如何管理依賴是一道繞不過去的坎,軟件開發過程中,我們往往會使用這樣那樣的第三方庫,這個時候,一個好的依賴管理就顯得尤為重要了。作為一個自動構建工作,Gradle對依賴管理有着很好的支持。
通常我們使用IDE(Eclipse、IDEA、Android Studio)開發Java項目,IDE自動為我們創建了Gradle文件,添加依賴也不過簡單的幾行代碼,這篇隨筆將從逐步解釋Gradle的依賴管理方法,希望對大家有所幫助。
如有錯誤,請不吝指出,非常感謝!如果本文對你有幫助,右下角點個推薦吧~
1.添加依賴包名
1.1 依賴類型
-
常見的依賴包含兩種類型。
(1) 一類是項目中所需要的庫,包括本地/倉庫中的文件和其他項目文件(例如一個多項目工程,一個項目依賴於另一個項目)
(2) 一類是實現自動化編譯、部署等所需的庫,包含Gradle的API和Groovy編寫的Task、Plugin等,這一類依賴在前2篇隨筆有提到和使用
1.2 聲明依賴
- 聲明依賴使用下面的閉包
1
2
3
|
dependencies {
<configuration name> <dependencies>
}
|
1.3 添加java依賴
-
在這里,我們以構建java項目為例,構建java項目首先需要應用
java插件
,插件的使用可參考上一篇隨筆Java Gradle之插件管理 -
java插件針對不同操作,將依賴分為10類(詳見 java plugin 45.5),下面介紹常用的5類
(1) compile:源代碼(src/main/java)編譯時的依賴,最常用
(2) runtime:源代碼(src/main/java)執行時依賴
(3) testCompile:測試代碼(src/main/test)編譯時的依賴
(4) testRuntime:測試代碼(src/main/java)執行時的依賴
(5) archives:項目打包(e.g.jar)時的依賴
-
通常,一個JAR依賴需包含JAR文件組(group/命名空間)、JAR文件名(name)、JAR文件版本(version),特殊情況下還可指定JDK版本。添加依賴可以有以下方式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
/* 單個依賴 */
compile group:
'log4j'
, name:
'log4j'
, version:
'1.2.17'
// 簡寫 => compile 'log4j:log4j:1.2.17'
/* 以數組形式添加多個依賴*/
compile
'joda-time:joda-time:2.9.2'
,
'log4j:log4j:1.2.17'
/* 閉包形式,以添加額外配置*/
compile (group:
'log4j'
, name:
'log4j'
, version:
'1.2.17'
){
// ... 額外配置
}
/* 等價於 */
compile (
'log4j:log4j:1.2.17'
){
// ... 額外配置
}
|
1.4 查找依賴包名
- 點擊maven網站
- 搜索需要導入的包,例如
gson
,點擊對應版本,例如2.6.2
- 選擇gradle,將會出現
'com.google.code.gson:gson:2.6.2'
- 復制 & 粘貼
1.5 完整的例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
// sourceCompatibility = 1.8為java版本,默認為當前JVM版本
apply plugin:
'java'
sourceCompatibility =
1.8
version =
'1.0'
repositories {
mavenCentral()
}
dependencies {
compile
'org.springframework:spring-context:4.2.1.RELEASE'
compile
'log4j:log4j:1.2.17'
}
|
- repositories{ ... } 是放置這些包的倉庫,接下來介紹
- sourceCompatibility、version只是java plugin的部分屬性,更多請看 java plugin 45.8
2.添加依賴倉庫
你可能會疑惑,聲明了這些依賴,這些依賴是在哪里找到的呢?repositories
定義了下載依賴的倉庫
1
2
3
4
5
6
7
8
9
10
11
12
13
|
/* Maven Central respoitory */
repositories {
mavenCentral()
}
/* Maven JCenter respoitory */
repositories {
jcenter()
}
/* Maven local respoitory */
/* 本地倉庫是之前下載的依賴,緩存在本地磁盤*/
repositories {
mavenLocal()
}
|
- 不需要記住倉庫的地址,直接使用即可,多個倉庫可以同時用,通常我們會將遠程倉庫與本地倉庫一起使用,因為緩存在本地磁盤上的文件速度更快,不需要重復下載。
- 關於
jcenter
和mavenCentral
的區別,推薦看stackoverflow的回答 - 當然,國外的倉庫在國內使用速度可能會比較慢,Gradle支持自定義地址,例如公司的倉庫地址、國內倉庫鏡像地址等。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
repositories {
mavenLocal()
/* 指定本地倉庫地址 */
/* 指定的遠程倉庫 */
/*
* 公司倉庫,可能需要驗證
* 不推薦直接將用戶名密碼寫在build.gradle中
* 可以寫在~/.gradle/gradle.properties中,再使用
*/
maven {
url
"<you_company_resp_url>"
credentials {
username
'your_username'
password
'your_password'
}
}
// 支持ivy倉庫
ivy { url
"<ivy_resp_url>"
}
}
|
- 有時,我們需要調用自己編譯實現的
*.jar
,我們也可以將包含這些文件的文件夾(不同於mavenLocal)映射為一個倉庫,但一般不推薦這樣做
1
2
3
|
repositories {
flatDir { dirs
'libs1/java/...'
,
'libs2'
}
}
|
3.依賴常見問題
3.1 依賴傳遞性
- 很多庫依賴於其他庫,例如a.jar依賴b.jar,在Gradle中,只需添加a.jar即可,Gradle將自動把a依賴的所有庫全部下載。
- 但是,有時你並不想讓Gradle自動去做這件事情,比如你希望明明白白地知道添加哪些庫,可以配置
transitive
實現,編譯時報錯,你就可以知道進一步需添加哪些庫。
1
2
3
4
|
dependencies {
// transitive 屬性默認為 true
compile group:
'log4j'
,name:
'log4j'
,version:
'1.2.17'
,transitive:
false
}
|
- 另一種情況是,依賴傳遞可能會導致版本沖突,即依賴傳遞下載的庫可能與項目依賴的另一個庫版本沖突,這種情況下可以排除一些庫,而下載其他所有的依賴庫,即選擇性排除。
1
2
3
4
5
6
7
|
dependencies {
compile (
'commons-httpclient:commons-httpclient:3.1'
){
exclude group:
'commons-codec'
//排除該group的依賴
// exclude group:'commons-codec',module:'commons-codec'
// group是必選項,module可選
}
}
|
3.2 版本沖突
- 版本沖突時十分常見的,比如下面的例子
1
2
3
4
5
|
// 庫 a 傳遞性依賴庫 b-1.2,與添加的b-1.1沖突
dependencies {
compile
'a:a:1.0'
compile
'b:b:1.1'
}
|
-
Gradle解決沖突有以下幾種方式
(1) 最近版本策略(默認):上例將忽略b-1.1,而下載b-1.2
(2) 沖突失敗策略:發生沖突時,編譯失敗(有些新版本庫並不兼容之前的,因此這個庫可以讓開發者主動作出選擇)
(3) 強制指定版本策略:發生沖突時,使用開發者指定的版本
1
2
3
4
5
6
7
8
|
/* 沖突失敗策略設置*/
configurations.all {
resolutionStrategy { failOnVersionConflict() }
}
/* 強制指定版本策略設置*/
dependencies {
compile group:
'b'
,name:
'b'
,version:
'1.1'
,force:
true
}
|
3.3 動態依賴
- 動態依賴增加了庫版本依賴時的靈活性
1
2
3
4
5
6
|
dependencies {
/* 選擇1以上任意一個版本,這使發生版本沖突的幾率變小*/
compile group:
'b'
,name:
'b'
,version:
'1.+'
/* 選擇最新的版本,避免直接指定版本號 */
compile group:
'a'
,name:
'a'
,version:
'latest.integration'
}
|
3.4 更多設置
- 指定庫文件類型
1
2
|
// ext 默認jar,可選屬性為war、zip
compile group:
'b'
,name:
'b'
,version:
'1.1'
,ext:
'war'
|
- 使用分類器(classifiers)
1
2
|
// 例如提供了2種包,a-1.0-dev.war, a-1.0-dev.jar
compile group:
'b'
,name:
'b'
,version:
'1.1'
,classifier:
'dev'
,ext:
'war'
|
- 替換傳遞依賴的版本
1
2
3
|
compile group:
'a'
,name:
'a'
,version:
'l.0'
{
dependencies
'b:b:1.1'
}
|
- 常用命令
(1) 查看所有依賴庫 gradle dependencies (2) 查看指定配置(詳見 1.3)的依賴庫 gradle dependencies -configuration <configuration> 例 gradle dependencies -configuration compile => 查看編譯時依賴 例 gradle dependencies -configuration runtime => 查看運行時依賴
http://www.cnblogs.com/gzdaijie/p/5296624.html