現代高效的java構建工具gradle的快速入門
和Maven一樣,Gradle隻是提供瞭構建項目的一個框架,真正起作用的是Plugin。Gradle在默認情況下為我們提供瞭許多常用的Plugin,其中包括有構建Java項目的Plugin,還有War,Ear等。與Maven不同的是,Gradle不提供內建的項目生命周期管理,隻是java Plugin向Project中添加瞭許多Task,這些Task依次執行,為我們營造瞭一種如同Maven般項目構建周期。更多有關Maven的知識,讀者可以訪問Maven官網,或者可以參考筆者寫的Maven學習系列文章。
現在我們都在談領域驅動設計,Gradle本身的領域對象主要有Project和Task。Project為Task提供瞭執行上下文,所有的Plugin要麼向Project中添加用於配置的Property,要麼向Project中添加不同的Task。一個Task表示一個邏輯上較為獨立的執行過程,比如編譯Java源代碼,拷貝文件,打包Jar文件,甚至可以是執行一個系統命令或者調用Ant。另外,一個Task可以讀取和設置Project的Property以完成特定的操作。
讓我們來看一個最簡單的Task,創建一個build.gradle文件,內容如下:
task helloWorld << { println "Hello World!" }
這裡的“<<”表示向helloWorld中加入執行代碼——其實就是groovy代碼。Gradle向我們提供瞭一整套DSL,所以在很多時候我們寫的代碼似乎已經脫離瞭groovy,但是在底層依然是執行的groovy。比如上面的task關鍵字,其實就是一個groovy中的方法,而大括號之間的內容則表示傳遞給task()方法的一個閉包。除瞭“<<”之外,我們還很多種方式可以定義一個Task,我們將在本系列後續的文章中講到。
在與build.gradle相同的目錄下執行:
gradle helloWorld
命令行輸出如下:
:helloWorld Hello World! BUILD SUCCESSFUL Total time: 2.544 secs
在默認情況下,Gradle將當前目錄下的build.gradle文件作為項目的構建文件。在上面的例子中,我們創建瞭一個名為helloWorld的Task,在執行gradle命令時,我們指定執行這個helloWorld Task。這裡的helloWorld是一個DefaultTask類型的對象,這也是定義一個Task時的默認類型,當然我們也可以顯式地聲明Task的類型,甚至可以自定義一個Task類型(我們將在本系列的後續文章中講到)。
比如,我們可以定義一個用於文件拷貝的Task:
task copyFile(type: Copy) { from 'xml' into 'destination' }
以上copyFile將xml文件夾中的所有內容拷貝到destination文件夾中。這裡的兩個文件夾都是相對於當前Project而言的,即build.gradle文件所在的目錄。
Task之間可以存在依賴關系,比如taskA依賴於taskB,那麼在執行taskA時,Gradle會先執行taskB,然後再執行taskA。聲明Task依賴關系的一種方式是在定義一個Task的時候:
task taskA(dependsOn: taskB) { //do something }
Gradle在默認情況下為我們提供瞭幾個常用的Task,比如查看Project的Properties、顯示當前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還默認為我們提供瞭dependencies、projects和properties等Task。dependencies用於顯示Project的依賴信息,projects用於顯示所有Project,包括根Project和子Project,而properties則用於顯示一個Project所包含的所有Property。
在默認情況下,Gradle已經為Project添加瞭很多Property,我們可以調用以下命令進行查看:
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,這裡隻包含一個根Project,在多項目構建中,它將包含多個Project;buildDir表示構建結果的輸出目錄;我們自己定義的helloWorld和copyFile也成為瞭Project中的Property。另外,Project還包括用於執行Ant命令的DefaultAntBuilder(Property名為ant)和Project的描述屬性description。
在下一篇文章中,我們將講到創建Task的多種方法。
請通過以下方式下載本系列文章的Github示例代碼:
git clone https://github.com/davenkin/gradle-learning.git
到此這篇關於現代高效的java構建工具gradle的快速入門的文章就介紹到這瞭,更多相關gradle 入門內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Java中的Gradle與Groovy的區別及存在的關系
- Gradle Build Cache引發的Task緩存編譯問題
- 詳解Gradle構建過程
- Android Studio 2020新版本卡在Gradle downloading/sync failed/下載緩慢/下載超時的問題
- gradle和maven有哪些區別