詳細學習怎樣管理Gradle構建的各種依賴。該學習記錄基於Gradle官方網站資料。本篇參考鏈接如下:

依賴管理的簡介:

https://docs.gradle.org/current/userguide/introduction_dependency_management.html

依賴管理的術語:

https://docs.gradle.org/current/userguide/dependency_management_terminology.html

依賴的種類:

https://docs.gradle.org/current/userguide/dependency_types.html

依賴管理的簡介及常用術語

下圖介紹了Gradle怎樣使用和管理從其他網絡倉庫中取得的依賴。

Gradle學習記錄012 依賴管理

通過一個簡單的java工程來描述上圖的具體含義。

這個java工程需要Google Guava類庫。爲了單體測試,它還需要junit。那麼Guava和junit類庫就是這個工程的依賴。Gradle構建腳本的開發者可以指定這些依賴的種類。依賴的種類大體有如下幾種:

  1. 模塊依賴(module dependency)
  2. 文件依賴(file dependency)
  3. 工程依賴(project dependency)
  4. GradleApi依賴,主要用於自定義插件或自定義任務
  5. GradleTestKit依賴,主要用於測試自定義插件或自定義任務
  6. GradleGroovy依賴,主要用於使用Groovy開發的Gradle自定義插件,一般用不到。

最長用的是模塊依賴。

首先Gradle需要知道去哪裏尋找模塊依賴所需的模塊。模塊存放的地方就叫做倉庫(repository)。倉庫需要在構建腳本中聲明。而且倉庫可以爲本地倉庫,也可以爲遠程倉庫。遠程倉庫比較常見的有mavenCentral,jCenter等

其次Gradle會從倉庫中取得所需模塊,並且存儲到Gradle的緩存中。當然,所需要的模塊如果依賴於其他模塊,其他模塊也會被取到緩存中待用。這就是之前提到過的依賴傳遞。

依賴種類

下面詳細學習一下依賴的種類,並給出示例

模塊依賴

模塊依賴是最普通的依賴。如下例,在構建腳本中有多重方法指定依賴。

另外示例中取得的依賴都是執行時依賴。這個後面會展開學習。

dependencies {
// 依賴參數(group,name,version)分別指定
runtime group: 'org.springframework', name: 'spring-core', version: '2.5'
// 依賴參數作爲一個參數指定,可指定多個
runtime 'org.springframework:spring-core:2.5',
'org.springframework:spring-aop:2.5'
// 依賴參數整體作爲列表進行指定
runtime(
[group: 'org.springframework', name: 'spring-core', version: '2.5'],
[group: 'org.springframework', name: 'spring-aop', version: '2.5']
)
// 依賴參數指定後,可通過閉包進行一些配置
runtime('org.hibernate:hibernate:3.0.5') {
// 指定是否允許依賴傳遞。true是允許。
transitive = true
}
// 使用了以上方法的一些組合
runtime group: 'org.hibernate', name: 'hibernate', version: '3.0.5', transitive: true
runtime(group: 'org.hibernate', name: 'hibernate', version: '3.0.5') {
transitive = true
}
}

文件依賴

文件依賴很強大,可以指定本地文件而不用將文件添加到某個倉庫。

dependencies {
// 可以指定單個或者複數個文件
runtime files('libs/a.jar', 'libs/b.jar')
// 甚至可以指定文件樹
runtime fileTree('libs') { include '*.jar' }
}

可以將構建中某個任務的輸出爲依賴。如下例:

dependencies {
compile files("$buildDir/classes") {
builtBy 'compile'
}
}
task compile {
doLast {
println 'compiling classes'
}
}

// 依賴於compile任務,所以compile任務先執行
task list(dependsOn: configurations.compile) {
doLast {
// 將dependencies中指定的需要編譯的文件編譯,放入指定文件夾
// 然後輸出路徑到控制檯
println "classpath = ${configurations.compile.collect { File file -> file.name }}"
}
}

輸出:

$ gradle -q list
compiling classes
classpath = [classes]

工程依賴

多工程構建時,可能會存在一個工程需要對另外一個工程的依賴。這種依賴關係叫做工程依賴。

dependencies {
implementation project(':shared')
}

Gradle特定依賴關係(Gradle distribution-specific dependencies)

以下三種叫做Gradle特定依賴,很少能夠用到。

  1. GradleApi依賴
  2. GradleTestKit依賴
  3. GradleGroovy依賴
相關文章