Java Gradle入門指南之依賴管理(添加依賴、倉庫、版本沖突) (轉)


本文為作者原創,轉載請注明出處: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()
/* 指定本地倉庫地址 */
maven { url  "file://E:/githubrepo/releases"  }
/* 指定的遠程倉庫 */
maven { url  "http://mvnrepository.com/"  }
/*
* 公司倉庫,可能需要驗證
* 不推薦直接將用戶名密碼寫在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



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM