使用Gradle編譯Java工程之Task篇

文章目的

經過本章的閱讀,瞭解Gradle中的任務和工程的關係,以及任務的定義和如何使用,接下來讓咱們開始編寫本身的任務代碼進行工程打包操做吧。閉包

須要準備

  • 一個熟悉的IDE開發工具
  • JDK 7及以上
  • Gradle 3.2以上

工程和任務的關係

在Gradle的世界中最重要的兩個概念就是:工程(Project)和任務(Task)。
每個Gradle的項目都會包含一個或多個工程,而每個工程的職責又取決於咱們對這個工程的定義,好比,一個工程多是公共的JAR庫,或者是一個WEB的應用程序,也多是一個用於發佈部署的ZIP包,而這個ZIP包又是經過其它工程編譯打包的JAR文件組裝成的。Gradle的編譯思想跟maven同樣, 也是約定優於配置,不過Gradle又比maven靈活,它爲工程提供了不少具體的配置項。maven

每個工程又由一個或多個任務組成,一個任務表明了一個工做的最小單元,它能夠是一次類的編譯、打一個JAR包、生成一份Javadoc或者是向倉庫中提交一次版本發佈。函數

接下來咱們就一步步的瞭解如何定義和使用任務來實現不一樣的編譯打包功能,咱們會先在一個獨立的工程中實現一些任務,而後再擴展到多個工程中去。工具

任務的定義和使用

當咱們使用Gradle的命令時,好比gradle build,Gradle命令會去尋找當前目錄下的build.gradle的文件,這個文件是Gradle的腳本文件,它裏面定義了工程和工程擁有的全部任務等信息。開發工具

咱們仍是使用IDEA開發工具打開以前的HelloWorld項目工程,把以前build.gradle文件中全部的內容所有刪除,開始今天的任務編寫。
首先咱們定義一個很簡單的任務hello,其代碼以下:gradle

task hello {
    doLast {
        println 'Hello world!'
    }
}

而後打開命令行端終,執行命令:gradle -q hello,這時咱們看到控制檯成功的打印輸出了:Hello world!',以下圖:ui

圖一 hello任務的結果spa

在以上代碼中,咱們定義了一個hello的任務,而後爲它添加了一個動做(action),當執行gradle hello命令時,該命令會調用hello任務,而後執行它的動做,打印輸出了Hello world!,這個動做是一個groovy的閉包函數。
若是你們對ant熟悉的話,可能會以爲Gradle的任務是否是和ant的類似?肯定是的,不過Gradle的任務比ant的靈活方便不少,在Gradle中咱們能夠像寫代碼同樣地實現不少ant很難實現的功能。命令行

對於上面hello任務的定義,咱們能夠使用一種更簡單便捷的方式實現。咱們能夠使用<<操做符來代替上面的doLast方法,以下:code

task hello << {
    println 'Hello world!'
}

任務的依賴關係

咱們能夠定義一個任務依賴於某個其它的任務,好比一個發佈(release)任務必須依賴編譯(build)任務,代碼以下:

task build {
    doLast {
        println "i'm build task"
    }
}
task release(dependsOn: build) {
    doLast {
        println "I'm release task"
    }
}

而後再執行gradle -q release,其輸出結果以下:

圖二 任務的依賴結果

對現有任務的操做

1,對現有的任務添加依賴關係

task build {
    doLast {
        println "i'm build task"
    }
}

task release() {
    doLast {
        println "I'm release task"
    }
}

// 添任務依賴關係
release.dependsOn build

其執行結果圖二同樣。

2,對現有的任務添加動做行爲

task hello {
    doLast {
        println 'Hello World!'
    }
}

// 法方一,在doFirst動做中添加
hello.doFirst {
    println 'Hello doFirst'
}

// 法方二 在doLast動做中添加
hello.doLast {
    println 'Hello doLast1'
}

// 法方三 在doLast動做中添加
hello {
    doLast {
        println 'Hello doLast2'
    }
}

執行gradle -q hello其結果以下:

圖三 添加動做行爲結果

3,訪問現有任務的屬性值

task hello {
    doLast {
        println "Hello world! from the $hello.name task."
    }
}

執行gradle -q hello其結果以下:

圖四 訪問任務的名稱

另外咱們還能夠爲任務設置屬性,主要經過ext.myProperty來初始化值,以下所示:

task myTask {
    ext.myProperty = "myValue"
}

task printTaskProperties {
    doLast {
        println myTask.myProperty
    }
}

其輸出結果爲:

> gradle -q printTaskProperties
myValue

4,在任務中調用groovy方法

task hello {
    doLast {
        int a = 1,b = 2;
        int result = add(a,b);
        println "a add b is = " + result;
    }
}

int add(int a,int b) {
    a + b;
}

執行gradle -q hello其結果以下:

圖五 任務調用方法結果

總結

使用Gradle編譯工程,其實就是在編譯不一樣的任務,而後根據依賴關係組合執行,最後完成整個項目工程的打包發佈。從工程和任務的關係,咱們也能看到Gradle把「分而治之」思想運用得恰到好處,實現中咱們一個項目可能包含若干個工程,這樣使用Gradle就能很好的解決自動化地編譯發佈了。

請喜歡文章的同窗關注我,有任何問題都在下方給我留言,我將會一一回復,我會把gradle的入門使用作成一系列的文章不斷的發佈。

做者:雲時代構架楊彪 連接:https://www.jianshu.com/p/a7b947c86650 來源:簡書 簡書著做權歸做者全部,任何形式的轉載都請聯繫做者得到受權並註明出處。

相關文章
相關標籤/搜索