現(xiàn)代高效的java構(gòu)建工具gradle的快速入門
和Maven一樣,Gradle只是提供了構(gòu)建項(xiàng)目的一個(gè)框架,真正起作用的是Plugin。Gradle在默認(rèn)情況下為我們提供了許多常用的Plugin,其中包括有構(gòu)建Java項(xiàng)目的Plugin,還有War,Ear等。與Maven不同的是,Gradle不提供內(nèi)建的項(xiàng)目生命周期管理,只是java Plugin向Project中添加了許多Task,這些Task依次執(zhí)行,為我們營造了一種如同Maven般項(xiàng)目構(gòu)建周期。更多有關(guān)Maven的知識(shí),讀者可以訪問Maven官網(wǎng),或者可以參考筆者寫的Maven學(xué)習(xí)系列文章。
現(xiàn)在我們都在談?lì)I(lǐng)域驅(qū)動(dòng)設(shè)計(jì),Gradle本身的領(lǐng)域?qū)ο笾饕蠵roject和Task。Project為Task提供了執(zhí)行上下文,所有的Plugin要么向Project中添加用于配置的Property,要么向Project中添加不同的Task。一個(gè)Task表示一個(gè)邏輯上較為獨(dú)立的執(zhí)行過程,比如編譯Java源代碼,拷貝文件,打包Jar文件,甚至可以是執(zhí)行一個(gè)系統(tǒng)命令或者調(diào)用Ant。另外,一個(gè)Task可以讀取和設(shè)置Project的Property以完成特定的操作。
讓我們來看一個(gè)最簡單的Task,創(chuàng)建一個(gè)build.gradle文件,內(nèi)容如下:
task helloWorld << { println "Hello World!" }
這里的“<<”表示向helloWorld中加入執(zhí)行代碼——其實(shí)就是groovy代碼。Gradle向我們提供了一整套DSL,所以在很多時(shí)候我們寫的代碼似乎已經(jīng)脫離了groovy,但是在底層依然是執(zhí)行的groovy。比如上面的task關(guān)鍵字,其實(shí)就是一個(gè)groovy中的方法,而大括號(hào)之間的內(nèi)容則表示傳遞給task()方法的一個(gè)閉包。除了“<<”之外,我們還很多種方式可以定義一個(gè)Task,我們將在本系列后續(xù)的文章中講到。
在與build.gradle相同的目錄下執(zhí)行:
gradle helloWorld
命令行輸出如下:
:helloWorld Hello World! BUILD SUCCESSFUL Total time: 2.544 secs
在默認(rèn)情況下,Gradle將當(dāng)前目錄下的build.gradle文件作為項(xiàng)目的構(gòu)建文件。在上面的例子中,我們創(chuàng)建了一個(gè)名為helloWorld的Task,在執(zhí)行g(shù)radle命令時(shí),我們指定執(zhí)行這個(gè)helloWorld Task。這里的helloWorld是一個(gè)DefaultTask類型的對象,這也是定義一個(gè)Task時(shí)的默認(rèn)類型,當(dāng)然我們也可以顯式地聲明Task的類型,甚至可以自定義一個(gè)Task類型(我們將在本系列的后續(xù)文章中講到)。
比如,我們可以定義一個(gè)用于文件拷貝的Task:
task copyFile(type: Copy) { from 'xml' into 'destination' }
以上copyFile將xml文件夾中的所有內(nèi)容拷貝到destination文件夾中。這里的兩個(gè)文件夾都是相對于當(dāng)前Project而言的,即build.gradle文件所在的目錄。
Task之間可以存在依賴關(guān)系,比如taskA依賴于taskB,那么在執(zhí)行taskA時(shí),Gradle會(huì)先執(zhí)行taskB,然后再執(zhí)行taskA。聲明Task依賴關(guān)系的一種方式是在定義一個(gè)Task的時(shí)候:
task taskA(dependsOn: taskB) { //do something }
Gradle在默認(rèn)情況下為我們提供了幾個(gè)常用的Task,比如查看Project的Properties、顯示當(dāng)前Project中定義的所有Task等??梢酝ㄟ^一下命令查看Project中所有的Task:
gradle tasks
輸出如下:
:tasks
------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------Build Setup tasks
-----------------
setupBuild - Initializes a new Gradle build. [incubating]
wrapper - Generates Gradle wrapper files. [incubating]Help tasks
----------
dependencies - Displays all dependencies declared in root project 'gradle-blog'.
dependencyInsight - Displays the insight into a specific dependency in root project 'gradle-blog'.
help - Displays a help message
projects - Displays the sub-projects of root project 'gradle-blog'.
properties - Displays the properties of root project 'gradle-blog'.
tasks - Displays the tasks runnable from root project 'gradle-blog'.Other tasks
-----------
copyFile
helloWorldTo see all tasks and more detail, run with --all.
BUILD SUCCESSFUL
Total time: 2.845 secs
可以看到,除了我們自己定義的copyFile和helloWorld之外,Gradle還默認(rèn)為我們提供了dependencies、projects和properties等Task。dependencies用于顯示Project的依賴信息,projects用于顯示所有Project,包括根Project和子Project,而properties則用于顯示一個(gè)Project所包含的所有Property。
在默認(rèn)情況下,Gradle已經(jīng)為Project添加了很多Property,我們可以調(diào)用以下命令進(jìn)行查看:
gradle properties
輸出如下:
:properties
------------------------------------------------------------
Root project
------------------------------------------------------------allprojects: [root project 'gradle-blog']
ant: org.gradle.api.internal.project.DefaultAntBuilder@1342097buildDir: /home/davenkin/Desktop/gradle-blog/build
buildFile: /home/davenkin/Desktop/gradle-blog/build.gradle
...
configurations: []
convention: org.gradle.api.internal.plugins.DefaultConvention@11492ed
copyFile: task ':copyFile'
...
ext: org.gradle.api.internal.plugins.DefaultExtraPropertiesExtension@1b5d53a
extensions: org.gradle.api.internal.plugins.DefaultConvention@11492ed
...
helloWorld: task ':helloWorld'
...
plugins: [org.gradle.api.plugins.HelpTasksPlugin@7359f7]
project: root project 'gradle-blog'
...
properties: {...}
repositories: []tasks: [task ':copyFile', task ':helloWorld']
version: unspecifiedBUILD SUCCESSFUL
Total time: 2.667 secs
在以上Property中,allprojects表示所有的Project,這里只包含一個(gè)根Project,在多項(xiàng)目構(gòu)建中,它將包含多個(gè)Project;buildDir表示構(gòu)建結(jié)果的輸出目錄;我們自己定義的helloWorld和copyFile也成為了Project中的Property。另外,Project還包括用于執(zhí)行Ant命令的DefaultAntBuilder(Property名為ant)和Project的描述屬性description。
在下一篇文章中,我們將講到創(chuàng)建Task的多種方法。
請通過以下方式下載本系列文章的Github示例代碼:
git clone https://github.com/davenkin/gradle-learning.git
到此這篇關(guān)于現(xiàn)代高效的java構(gòu)建工具gradle的快速入門的文章就介紹到這了,更多相關(guān)gradle 入門內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解SpringBoot中RestTemplate的幾種實(shí)現(xiàn)
這篇文章主要介紹了詳解SpringBoot中RestTemplate的幾種實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11Java SpringBoot+vue+實(shí)戰(zhàn)項(xiàng)目詳解
這篇文章主要介紹了SpringBoot+VUE實(shí)現(xiàn)前后端分離的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-09-09SpringBoot中的統(tǒng)一異常處理詳細(xì)解析
這篇文章主要介紹了SpringBoot中的統(tǒng)一異常處理詳細(xì)解析,該注解可以把異常處理器應(yīng)用到所有控制器,而不是單個(gè)控制器,借助該注解,我們可以實(shí)現(xiàn):在獨(dú)立的某個(gè)地方,比如單獨(dú)一個(gè)類,定義一套對各種異常的處理機(jī)制,需要的朋友可以參考下2024-01-01SpringBoot模擬員工數(shù)據(jù)庫并實(shí)現(xiàn)增刪改查操作
這篇文章主要給大家介紹了關(guān)于SpringBoot模擬員工數(shù)據(jù)庫并實(shí)現(xiàn)增刪改查操作的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-09-09關(guān)于通過Java連接mysql對反斜杠”\“轉(zhuǎn)義的測試詳解
這篇文章主要給大家介紹了關(guān)于通過Java連接mysql對反斜杠”\“轉(zhuǎn)義的測試的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家理解反斜杠”\“轉(zhuǎn)義具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-06-06Spring Boot優(yōu)化后啟動(dòng)速度快到飛起技巧示例
這篇文章主要為大家介紹了Spring Boot優(yōu)化后啟動(dòng)速度快到飛起的技巧示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07淺談導(dǎo)入JavaWeb 項(xiàng)目出現(xiàn)的問題
這篇文章主要介紹了導(dǎo)入JavaWeb 項(xiàng)目出現(xiàn)的問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03spring webflux自定義netty 參數(shù)解析
這篇文章主要介紹了spring webflux自定義netty 參數(shù)解析,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09