1. 構(gòu)建塊
Gradle構(gòu)建中的兩個基本概念是項目(project)和任務(wù)(task),每個構(gòu)建至少包含一個項目,項目中包含一個或多個任務(wù)。在多項目構(gòu)建中,一個項目可以依賴于其他項目;類似的,任務(wù)可以形成一個依賴關(guān)系圖來確保他們的執(zhí)行順序。

1.1 項目
我們能夠使用以下配置文件對Gradle的構(gòu)建進(jìn)行配置:
- Gradle構(gòu)建腳本(build.gradle)指定了一個項目和它的任務(wù)。
- Gradle屬性文件(gradle.properties)用來配置構(gòu)建屬性。
- Gradle設(shè)置文件(gradle.settings)對于只有一個項目的構(gòu)建而言是可選的,如果我們的構(gòu)建中包含多于一個項目,那么它就是必須的,因為它描述了哪一個項目參與構(gòu)建。每一個多項目的構(gòu)建都必須在項目結(jié)構(gòu)的根目錄中加入一個設(shè)置文件。
Gradle為每個build.gradle都會創(chuàng)建一個相應(yīng)的Project領(lǐng)域?qū)ο?,在編寫Gradle腳本時,我們實際上是在操作諸如Project這樣的Gradle領(lǐng)域?qū)ο?。在多Project的項目中,我們會操作多個Project領(lǐng)域?qū)ο蟆?/p>
當(dāng)構(gòu)建啟動后,gradle會基于build.gradle實例化一個org.gradle.api.Project類,并且能夠通過project變量使其隱式可用,也就是所有變量、方法的調(diào)用都在project。如下面兩句話是一樣的:
group = 'com.abc.gradle'
project.group = 'com.abc.gradle'
調(diào)用的是Project類的setGroup():

【項目重要屬性】
項目幾個重要的屬性:group、name、version,這三個屬性是一個項目的坐標(biāo)。
- group屬性指定依賴的分組(在Maven中,就是groupId)。
- name屬性指定依賴的名稱(在Maven中,就是artifactId)。
- version屬性指定外部依賴的版本(在Maven中,就是version)。
我們假設(shè)我們需要指定以下依賴:
- 依賴的分組是foo。
- 依賴的名稱是foo。
- 依賴的版本是0.1。
- 在項目編譯時需要這些依賴。
我們可以將以下代碼片段加入到build.gradle中,進(jìn)行依賴聲明:
dependencies {
compile group: 'foo', name: 'foo', version: '0.1'
}
我們也可以采用一種快捷方式聲明依賴:[group]:[name]:[version]。如果我們想用這種方式,我們可以將以下代碼段加入到build.gradle中:
dependencies {
compile 'foo:foo:0.1'
}
我們也可以在同一個配置項中加入多個依賴,傳統(tǒng)的方式如下:
dependencies {
compile (
[group: 'foo', name: 'foo', version: '0.1'],
[group: 'bar', name: 'bar', version: '0.1']
)
}
如果采用快捷方式,那可以是這樣:
dependencies {
compile 'foo:foo:0.1', 'bar:bar:0.1'
}
自然地,聲明屬于不同配置項的依賴也是可以的。比如說,如果我們想要聲明屬于compile和testCompile配置項的依賴,可以這么做:
dependencies {
compile group: 'foo', name: 'foo', version: '0.1'
testCompile group: 'test', name: 'test', version: '0.1'
}
同樣的,給力的快捷方式又來了( ̄︶ ̄)
dependencies {
compile 'foo:foo:0.1'
testCompile 'test:test:0.1'
}
【項目重要的方法】
(1)apply:應(yīng)用一個插件
(2)dependencies:聲明項目依賴于哪些jar包或其他項目
(3)repositories:去哪個倉庫找依賴的jar包,在倉庫里面根據(jù)group、name、version確定一個組件
一個Java項目總會依賴于第三方,要么是一個第三方類庫,比如Apache commons;要么是你自己開發(fā)的另外一個Java項目,比如你的web項目依賴于另一個核心的業(yè)務(wù)項目。通常來說,這種依賴的表示形式都是將第三方的Jar文件放在自己項目的classpath下,要么是編譯時的classpath,要么是運行時的classpath。
在聲明對第三方類庫的依賴時,我們需要告訴Gradle在什么地方去獲取這些依賴,即配置Gradle的Repository。在配置好依賴之后,Gradle會自動地下載這些依賴到本地。Gradle可以使用Maven和Ivy的Repository,同時它還可以使用本地文件系統(tǒng)作為Repository。
要配置Maven的Repository是非常簡單,首先我們先了解以下概念。
| 名稱 | 解釋 |
|---|---|
| 工件坐標(biāo) | 工件可以簡單地理解為一個jar包。坐標(biāo)就是三個屬性:group、name、version。通過這三個屬性可以唯一確定一個jar包。 |
| 常用倉庫 | 存儲jar包的地方。常用的倉庫有:mavenLocal/mavenCentral/jcenter、自定義maven倉庫、文件倉庫(基本不怎么使用)。 |
要配置倉庫,我們只需要在build.gradle文件中加入以下代碼即可:
repositories{ // 配置倉庫,可以配置多個倉庫,按照倉庫的順序去查找jar包
maven{
url '私服地址'
}
mavenLocal()
mavenCentral()
}
mavenLocal就是本地倉庫:

mavenCentral就是下面這個網(wǎng)站:

在這個網(wǎng)站搜索想要添加的依賴,復(fù)制粘貼到到build.gradle即可添加依賴:

有了倉庫,我們就可以為Gradle配置依賴:
dependencies{
testCompile group:'junit',name:'junit',version:'4.11' // 配置依賴
}
(4)task:聲明項目里面有什么任務(wù)
dependencies、repositories等都定義在project里面:

1.2 任務(wù)
任務(wù)主要包括任務(wù)動作和任務(wù)依賴。任務(wù)動作定義了一個最小的工作單元。可以定義依賴于其他任務(wù)、動作序列和執(zhí)行條件。
讓我們來看一個最簡單的Task,創(chuàng)建一個build.gradle文件,內(nèi)容如下:
task helloWorld << {
println "Hello World!"
}
這里的“<<”表示向helloWorld中加入執(zhí)行代碼——其實就是groovy代碼。Gradle向我們提供了一整套DSL,所以在很多時候我們寫的代碼似乎已經(jīng)脫離了groovy,但是在底層依然是執(zhí)行的groovy。比如上面的task關(guān)鍵字,其實就是一個groovy中的方法,而大括號之間的內(nèi)容則表示傳遞給task()方法的一個閉包。除了“<<”之外,我們還很多種方式可以定義一個Task。
在默認(rèn)情況下,Gradle將當(dāng)前目錄下的build.gradle文件作為項目的構(gòu)建文件。在上面的例子中,我們創(chuàng)建了一個名為helloWorld的Task,在執(zhí)行g(shù)radle命令時,我們指定執(zhí)行這個helloWorld Task。這里的helloWorld是一個DefaultTask類型的對象,這也是定義一個Task時的默認(rèn)類型,當(dāng)然我們也可以顯式地聲明Task的類型,甚至可以自定義一個Task類型。
在與build.gradle相同的目錄下執(zhí)行:
gradle helloWorld
命令行輸出如下:
:helloWorld
Hello World!
BUILD SUCCESSFUL
Total time: 2.544 secs
任務(wù)里面重要的方法:
- dependsOn:聲明任務(wù)依賴。Task之間可以存在依賴關(guān)系,比如taskA依賴于taskB,那么在執(zhí)行taskA時,Gradle會先執(zhí)行taskB,然后再執(zhí)行taskA。聲明Task依賴關(guān)系的一種方式是在定義一個Task的時候:
task taskA(dependsOn: taskB) {
//do something
}
- doFirst、doLast<<:doFirst在任務(wù)列表最前面添加一個動作,doLast在任務(wù)列表最后面添加一個動作。一個任務(wù)可以執(zhí)行多次doFirst、doLast。
Gradle還默認(rèn)為我們提供了dependencies、projects和properties等Task。dependencies用于顯示Project的依賴信息,projects用于顯示所有Project,包括根Project和子Project,而properties則用于顯示一個Project所包含的所有Property。在默認(rèn)情況下,Gradle已經(jīng)為Project添加了很多Property,我們可以調(diào)用以下命令進(jìn)行查看:
gradle properties
在IDEA右側(cè)欄我們可以看到Gradle的任務(wù):

雙擊這個Task我們就可以執(zhí)行指定的Taks,效果和gradle [taskName]命令醫(yī)院。
我們執(zhí)行jar任務(wù)的時候發(fā)現(xiàn)前面還執(zhí)行了其他三個任務(wù),說明jar依賴于這三個任務(wù)。任務(wù)后面的“UP-TO-DATE”意思是最新的,上次構(gòu)件之后這個任務(wù)的輸入輸出并沒有改變,所以這個是跳過的并沒有執(zhí)行。

2. 構(gòu)建生命周期

配置:如def ...這些就是配置代碼,在配置階段執(zhí)行。
執(zhí)行:如doFirst、doLast這些動作代碼會在執(zhí)行階段執(zhí)行。
Gradle還為我們提供了構(gòu)造方法,在初始化完成、配置完成、執(zhí)行完成都有一個構(gòu)造方法。
