轉(zhuǎn)自:http://www.cnblogs.com/davenkin/p/gradle-learning-6.html
請通過以下方式下載本系列文章的Github示例代碼:
git clone https://github.com/davenkin/gradle-learning.git
Gradle最常用的Plugin便是java Plugin了。和其他Plugin一樣,java Plugin并沒有什么特別的地方,只是向Project中引入了多個Task和Property。當(dāng)然,java Plugin也有比較與眾不同的地方,其中之一便是它在項(xiàng)目中引入了構(gòu)建生命周期的概念,就像Maven一樣。但是,和Maven不同的是,Gradle的項(xiàng)目構(gòu)建生命周期并不是Gradle的內(nèi)建機(jī)制,而是由Plugin自己引入的。
(一)java Plugin引入的主要Task
執(zhí)行“gradle build”,我們已經(jīng)可以看到j(luò)ava Plugin所引入的主要Task:
:compileJava
:processResources
:classes
:jar
:assemble
:compileTestJava
:processTestResources
:testClasses
:test
:check
:build
BUILD SUCCESSFUL
Total time: 4.813 secs
build也是java Plugin所引入的一個Task,它依賴于其他Task,其他Task又依賴于另外的Task,所以有了以上Task執(zhí)行列表。以上Task執(zhí)行列表基本上描述了java Plugin向項(xiàng)目中所引入的構(gòu)建生命周期概念。
除了定義眾多的Task外,java Plugin還向Project中加入了一些額外的Property。比如,sourceCompatibility用于指定在編譯Java源文件時所使用的Java版本,archivesBaseName用于指定打包成Jar文件時的文件名稱。
(二)Java項(xiàng)目的目錄結(jié)構(gòu)
在默認(rèn)情況下,Gradle采用了與Maven相同的Java項(xiàng)目目錄結(jié)構(gòu):
關(guān)于Maven標(biāo)準(zhǔn)目錄結(jié)構(gòu),請參考Maven官網(wǎng)。當(dāng)然,跟Maven一樣,以上只是默認(rèn)的目錄結(jié)構(gòu),我們可以通過配置來修改這些目錄結(jié)構(gòu)。
(三)配置已有source set
Gradle在采用了Maven目錄結(jié)構(gòu)的同時,還融入了自己的一些概念,即source set。對于上圖中的目錄結(jié)構(gòu),Gradle實(shí)際上為我們創(chuàng)建了2個source set,一個名為main,一個名為test。
請注意,這里的source set的名字main與上圖目錄結(jié)構(gòu)中的main文件夾并無必然的聯(lián)系,只是在默認(rèn)情況下,Gradle為了source set概念到文件系統(tǒng)目錄結(jié)構(gòu)的映射方便,才采用了相同的名字。對于test, 也是如此。我們完全可以在build.gradle文件中重新配置這些source set所對應(yīng)的目錄結(jié)構(gòu),同時,我們還可以創(chuàng)建新的source set。
從本質(zhì)上講,Gradle的每個source set都包含有一個名字,并且包含有一個名為java的Property和一個名為resources的Property,他們分別用于表示該source set所包含的Java源文件集合和資源文件集合。在實(shí)際應(yīng)用時,我們可以將他們設(shè)置成任何目錄值。比如,我們可以重新設(shè)置main的目錄結(jié)構(gòu):
sourceSets {
????main {
????????java {
????????????srcDir 'java-sources'
????????}
????????resources {
????????????srcDir 'resources'
????????}
????}
}
此時所對應(yīng)的項(xiàng)目目錄結(jié)構(gòu)如下:
我們重新設(shè)置了main的目錄結(jié)構(gòu),而對于test,我們保留了Gradle默認(rèn)的目錄結(jié)構(gòu)。
(四)創(chuàng)建新的source set
要創(chuàng)建一個新的source set也是非常簡單的,比如,我們可以創(chuàng)建一個名為api的source set來存放程序中的接口類:
sourceSets {
????api
}
當(dāng)然,以上配置也可以與main放在一起。在默認(rèn)情況下,該api所對應(yīng)的Java源文件目錄被Gradle設(shè)置為${path-to-project}/src/api/java,而資源文件目錄則被設(shè)置成了${path-to-project}/src/api/resources。我們也可以像上面的main一樣重新對api的目錄結(jié)構(gòu)進(jìn)行配置。
Gradle會自動地為每一個新創(chuàng)建的source set創(chuàng)建相應(yīng)的Task,創(chuàng)建規(guī)律為:對于名為mySourceSet的source set,Gradle將為其創(chuàng)建compileJava、processResources和Classes這3個Task。對于這里api而言,Gradle會為其創(chuàng)建名為compileApiJava、processApiResource和apiClasses Task。我們可以在命令行中執(zhí)行"gradle apiClasses"。
你可能會注意到,對于main而言,Gradle并沒有相應(yīng)的compileMainJava,原因在于:由于main是Gradle默認(rèn)創(chuàng)建的source set,并且又是及其重要的source set,Gradle便省略掉了其中的“Main”,而是直接使用了compileJava作為main的編譯Task。對于test來說,Gradle依然采用了compileTestJava。
通常的情況是,我們自己創(chuàng)建的名為api的source set會被其他source set所依賴,比如main中的類需要實(shí)現(xiàn)api中的某個接口等。此時我們需要做兩件事情。第一,我們需要在編譯main之前對api進(jìn)行編譯,即編譯main中Java源文件的Task應(yīng)該依賴于api中的Task:
classes.dependsOn apiClasses
第二,在編譯main時,我們需要將api編譯生成的class文件放在main的classpath下。此時,我們可以對main和test做以下配置:
sourceSets {
????main {
????????compileClasspath = compileClasspath + files(api.output.classesDir)
????}
????test {
????????runtimeClasspath = runtimeClasspath + files(api.output.classesDir)
????}
}
之所以需要對test的runtimeClasspath進(jìn)行設(shè)置,是因?yàn)樵谶\(yùn)行測試時我們也需要加載api中的類。
在下一篇文章中,我們將講到如何管理依賴。