Gradle學(xué)習(xí)系列之六——使用Java Plugin

轉(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中的類。

在下一篇文章中,我們將講到如何管理依賴。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,654評論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,192評論 25 708
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,281評論 6 342
  • 六月書目之一,伊坂幸太郎《死神的浮力》。老實(shí)說不是新作,但紙質(zhì)裝幀真是好看得緊,不做多想買下。 伊坂幸太郎的書某個...
    乙男A恒藍(lán)閱讀 267評論 0 0
  • 從兒子今年上大班第一次寫作業(yè)到現(xiàn)在已經(jīng)兩個多月了,猶記得前幾次做作業(yè)的場景,哭,鬧,委屈,磨嘰,各種招數(shù),各種煩躁...
    海天陽閱讀 192評論 0 0

友情鏈接更多精彩內(nèi)容