Learn Gradle - CH 3 Java 快速入門

上一章(連接)咱們主要對Gradle的腳本進行了簡要的介紹,本章咱們將繼續學習Gradle的另一個特性——插件(plugins)。html

一、插件介紹

插件是對Gradle功能的擴展,Gradle有着豐富的插件,你能夠在這裏搜索相關插件(傳送門)。本章將簡要介紹Gradle的Java插件(Java plugin),這個插件會給你的構建項目添加一些任務,好比編譯java類、執行單元測試和將編譯的class文件打包成jar文件等。java

Java插件是基於約定的(約定優於配置),它在項目的不少方面定義了默認值,例如,Java源文件應該位於什麼位置。咱們只要遵循插件的約定,就不須要在Gradle配置腳本進行額外的相關配置。固然,在某些狀況下,你的項目不想或不能遵循這個約定也是能夠的,這樣你就須要額外的配置你的構建腳本。web

Gradle Java插件對於項目文件存放的默認位置與maven相似。api

Java源碼存放在目錄:src/main/javaapp

Java測試代碼存放目錄:src/test/javaeclipse

資源文件存放目錄:src/main/resourceswebapp

測試相關資源文件存放目錄:src/test/resourcesmaven

全部輸出文件位於目錄:buildide

輸出的jar文件位於目錄:build/libs單元測試

二、一個簡單的Java項目

新建一個文件build.gradle,添加代碼:

apply plugin: 'java'

以上代碼即配置java插件到構建腳本中。當執行構建腳本時,它將給項目添加一系列任務。咱們執行:gradle build,來看看輸出的結果:

:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:jar UP-TO-DATE
:assemble UP-TO-DATE
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:check UP-TO-DATE
:build UP-TO-DATE

BUILD SUCCESSFUL

根據輸出結果能夠看出,咱們執行的build這個任務依賴其餘任務,好比compileJava等,這就是java插件預先定義好的一系列任務。

你還能夠執行一些其餘的任務,好比執行:gradle clean,gradle assemble,gradle check等。

gradle clean:刪除構建目錄以及已經構建完成的文件;

gradle assemble(裝配):編譯和打包java代碼,可是不會執行單元測試(從上面的任務依賴結果也能夠看出來)。若是你應用了其餘插件,那麼還會完成一下其餘動做。例如,若是你應用了War這個插件,那麼這個任務將會爲你的項目生成war文件。

gradle check:編譯且執行測試。與assemble相似,若是你應用了其餘包含check任務的插件,例如,Checkstyle插件,那麼這個任務將會檢查你的項目代碼的質量,而且生成檢測報告。

若是想知道Gradle當前配置下哪些任務可執行,能夠執行:gradle tasks,例如應用了java插件的配置,執行該命令,輸出:

:tasks

------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------

Build tasks
-----------
assemble - Assembles the outputs of this project.
build - Assembles and tests this project.
buildDependents - Assembles and tests this project and all projects that depend on it.
buildNeeded - Assembles and tests this project and all projects it depends on.
classes - Assembles classes 'main'.
clean - Deletes the build directory.
jar - Assembles a jar archive containing the main classes.
testClasses - Assembles classes 'test'.

Build Setup tasks
-----------------
init - Initializes a new Gradle build. [incubating]
wrapper - Generates Gradle wrapper files. [incubating]

Documentation tasks
-------------------
javadoc - Generates Javadoc API documentation for the main source code.

Help tasks
----------
components - Displays the components produced by root project 'learn-gradle'. [incubating]
dependencies - Displays all dependencies declared in root project 'learn-gradle'                                                                                                      .
dependencyInsight - Displays the insight into a specific dependency in root project 'learn-gradle'.
help - Displays a help message.
model - Displays the configuration model of root project 'learn-gradle'. [incubating]
projects - Displays the sub-projects of root project 'learn-gradle'.
properties - Displays the properties of root project 'learn-gradle'.
tasks - Displays the tasks runnable from root project 'learn-gradle'.

Verification tasks
------------------
check - Runs all checks.
test - Runs the unit tests.

Rules
-----
Pattern: clean<TaskName>: Cleans the output files of a task.
Pattern: build<ConfigurationName>: Assembles the artifacts of a configuration.
Pattern: upload<ConfigurationName>: Assembles and uploads the artifacts belonging to a configuration.

To see all tasks and more detail, run gradle tasks --all

To see more detail about a task, run gradle help --task <task>

BUILD SUCCESSFUL

小夥伴們看到這裏會不會有疑問,若是在構建腳本中定義了名爲tasks的任務,執行會是如何?好奇的小夥伴能夠本身試一試噢。事實上,是會覆蓋原有的任務的。

三、外部依賴

一般一個Java項目會依賴多個其餘項目或jar文件,咱們能夠經過配置gradle倉庫(repository)告訴gradle從哪裏獲取須要的依賴,而且gradle還能夠配置使用maven倉庫。例如,咱們配置gradle使用maven中央倉庫,在build.gradle中添加代碼:

repositories {
    mavenCentral()
}

接下來,咱們來添加一些依賴。代碼示例:

dependencies {
    compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
    testCompile group: 'junit', name: 'junit', version: '4.+'
}

關於依賴,暫時就點這麼多。詳細能夠參考gradle依賴管理基礎,也能夠關注後續文章。

四、定義項目屬性

Java插件會爲項目添加一系列的屬性,一般狀況下,初始的Java項目使用這些默認配置就足夠了,咱們不須要進行額外的配置。可是若是默認屬性不知足於你的項目,你也能夠進行自定義項目的一些信息。例如咱們爲項目指定版本號和一些jar manifest信息。

sourceCompatibility = 1.5
version = '1.0'
jar {
    manifest {
        attributes 'Implementation-Title': 'Gradle Quickstart', 'Implementation-Version': version
    }
}

事實上,Java插件添加的一系列任務與咱們以前在腳本中自定義的任務沒什麼區別,都是很常規的任務。咱們能夠隨意定製和修改這些任務。例如,設置任務的屬性、爲任務添加行爲、改變任務的依賴,甚至替換已有的任務。例如咱們能夠配置Test類型的test任務,當test任務執行的時候,添加一個系統屬性。配置腳本以下:

test {
    systemProperties 'property': 'value'
}

另外,與以前提到的「gradle tasks」命令類型,咱們能夠經過「gradle properties」來查看當前配置所支持的可配置屬性有哪些。

五、將Jar文件發佈到倉庫

uploadArchives {
    repositories {
       flatDir {
           dirs 'repos'
       }
    }
}

執行gradle uploadArchives,將會把相關jar文件發佈到reops倉庫中。更多參考:Publishing artifacts

六、構建多個Java項目

假設咱們的項目結構以下所示:

multiproject/
--api/
--services/webservice/
--shared/
--services/shared/

項目api生成jar文件,Java客戶端經過jar提供的接口訪問web服務;項目services/webservice是一個webapp,提供web服務;項目shared 包含api和webservice公共代碼;項目services/shared依賴shared項目,包含webservice公共代碼。

接下來,咱們開始定義多項目構建。

1)首先,咱們須要添加一個配置文件:settings.gradle文件。settings.gradle位於項目的根目錄,也就是multiproject目錄。編輯settings.gradle,輸入配置信息:

include "shared", "api", "services:webservice", "services:shared"

include是Gradle DSL定義的核心類型Settings的方法,用於構建指定項目。配置中指定的參數「shared」、「api」等默認是當前配置目錄的目錄名稱,而「services:webservice」將根據默認約定映射系統物理路徑"services/webservice"(相對於根目錄)。關於include更詳細的信息能夠參考:構建樹

2)定義全部子項目公用配置。在根目錄建立文件:build.gradle,輸入配置信息:

subprojects {
    apply plugin: 'java'
    apply plugin: 'eclipse-wtp'

    repositories {
       mavenCentral()
    }

    dependencies {
        testCompile 'junit:junit:4.12'
    }

    version = '1.0'

    jar {
        manifest.attributes provider: 'gradle'
    }
}

subprojects 是Gradle DSL定義的構建腳本模塊之一,用於定義全部子項目的配置信息。在以上配置中,咱們給全部子項目定義了使用「java」和「eclipse-wtp」插件,還定義了倉庫、依賴、版本號以及jar(jar是Gradle的任務類型之一,任務是裝配jar包,jar任務包含屬性manifest,用於描述jar的信息,具體參考:Jar)。

咱們在根目錄執行gradle build命令是,這些配置會應用到全部子項目中。

3)給項目添加依賴

新建文件:api/build.gradle,添加配置:

dependencies {
    compile project(':shared')
}

以上,咱們定義了api項目依賴shared項目,當咱們在根目錄執行gradle build命令時,gradle會確保在編譯api以前,先完成shared項目編譯,而後纔會編譯api項目。

一樣,添加services/webservice/build.gradle,添加配置:

dependencies {
    compile project(':services:shared')
}

在根目錄執行:gradle compileJava,輸出:

:shared:compileJava UP-TO-DATE
:shared:processResources UP-TO-DATE
:shared:classes UP-TO-DATE
:shared:jar UP-TO-DATE
:api:compileJava UP-TO-DATE
:services:compileJava UP-TO-DATE
:services:shared:compileJava UP-TO-DATE
:services:shared:processResources UP-TO-DATE
:services:shared:classes UP-TO-DATE
:services:shared:jar UP-TO-DATE
:services:webservice:compileJava UP-TO-DATE

BUILD SUCCESSFUL

經過輸出信息咱們就能夠清楚看出依賴配置是否正確啦。本次教程到此結束。

本文是本人初學Gradle所做筆記,是在邊學習Gradle邊寫做的狀況下完成,若是錯漏,還請看客們勿噴。若能友好指出,共同進步,本人不甚感激。

相關文章
相關標籤/搜索