& 160;& 160;& 160;& 160;開發任何軟體,如何管理依賴是一道繞不過去的坎,軟體開發過程中,我們往往會使用這樣那樣的第三方庫,這個時候,一個好的依賴管理就顯得尤為重要了。作為一個自動構建工作,Gradle對依賴管理有著很好的支持。 & 160;& 160;& 160;& 160;通
開發任何軟體,如何管理依賴是一道繞不過去的坎,軟體開發過程中,我們往往會使用這樣那樣的第三方庫,這個時候,一個好的依賴管理就顯得尤為重要了。作為一個自動構建工作,Gradle對依賴管理有著很好的支持。
通常我們使用IDE(Eclipse、IDEA、Android Studio)開發Java項目,IDE自動為我們創建了Gradle文件,添加依賴也不過簡單的幾行代碼,這篇隨筆將從逐步解釋Gradle的依賴管理方法,希望對大家有所幫助。
如有錯誤,請不吝指出,非常感謝!如果本文對你有幫助,右下角點個推薦吧~
1.添加依賴包名
1.1 依賴類型
常見的依賴包含兩種類型。
(1) 一類是項目中所需要的庫,包括本地/倉庫中的文件和其他項目文件(例如一個多項目工程,一個項目依賴於另一個項目)
(2) 一類是實現自動化編譯、部署等所需的庫,包含Gradle的API和Groovy編寫的Task、Plugin等,這一類依賴在前2篇隨筆有提到和使用
1.2 聲明依賴
- 聲明依賴使用下麵的閉包
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版本。添加依賴可以有以下方式:
/* 單個依賴 */
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 完整的例子
// 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
定義了下載依賴的倉庫
/* Maven Central respoitory */
repositories {
mavenCentral()
}
/* Maven JCenter respoitory */
repositories {
jcenter()
}
/* Maven local respoitory */
/* 本地倉庫是之前下載的依賴,緩存在本地磁碟*/
repositories {
mavenLocal()
}
- 不需要記住倉庫的地址,直接使用即可,多個倉庫可以同時用,通常我們會將遠程倉庫與本地倉庫一起使用,因為緩存在本地磁碟上的文件速度更快,不需要重覆下載。
- 關於
jcenter
和mavenCentral
的區別,推薦看stackoverflow的回答 - 當然,國外的倉庫在國內使用速度可能會比較慢,Gradle支持自定義地址,例如公司的倉庫地址、國內倉庫鏡像地址等。
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)映射為一個倉庫,但一般不推薦這樣做
repositories {
flatDir { dirs 'libs1/java/...','libs2' }
}
3.依賴常見問題
3.1 依賴傳遞性
- 很多庫依賴於其他庫,例如a.jar依賴b.jar,在Gradle中,只需添加a.jar即可,Gradle將自動把a依賴的所有庫全部下載。
- 但是,有時你並不想讓Gradle自動去做這件事情,比如你希望明明白白地知道添加哪些庫,可以配置
transitive
實現,編譯時報錯,你就可以知道進一步需添加哪些庫。
dependencies {
// transitive 屬性預設為 true
compile group:'log4j',name:'log4j',version:'1.2.17',transitive:false
}
- 另一種情況是,依賴傳遞可能會導致版本衝突,即依賴傳遞下載的庫可能與項目依賴的另一個庫版本衝突,這種情況下可以排除一些庫,而下載其他所有的依賴庫,即選擇性排除。
dependencies {
compile ('commons-httpclient:commons-httpclient:3.1'){
exclude group:'commons-codec' //排除該group的依賴
// exclude group:'commons-codec',module:'commons-codec'
// group是必選項,module可選
}
}
3.2 版本衝突
- 版本衝突時十分常見的,比如下麵的例子
// 庫 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) 強制指定版本策略:發生衝突時,使用開發者指定的版本
/* 衝突失敗策略設置*/
configurations.all {
resolutionStrategy { failOnVersionConflict() }
}
/* 強制指定版本策略設置*/
dependencies {
compile group:'b',name:'b',version:'1.1',force:true
}
3.3 動態依賴
- 動態依賴增加了庫版本依賴時的靈活性
dependencies {
/* 選擇1以上任意一個版本,這使發生版本衝突的幾率變小*/
compile group:'b',name:'b',version:'1.+'
/* 選擇最新的版本,避免直接指定版本號 */
compile group:'a',name:'a',version:'latest.integration'
}
3.4 更多設置
- 指定庫文件類型
// ext 預設jar,可選屬性為war、zip
compile group:'b',name:'b',version:'1.1',ext:'war'
- 使用分類器(classifiers)
// 例如提供了2種包,a-1.0-dev.war, a-1.0-dev.jar
compile group:'b',name:'b',version:'1.1',classifier:'dev',ext:'war'
- 替換傳遞依賴的版本
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 => 查看運行時依賴
分享創建價值,歡迎關註&留言~