首發於Enaium的個人博客
什麼是 Gradle
Gradle是一個基於Apache Ant和Apache Maven概念的項目自動化構建工具。它使用一種基於Groovy的特定領域語言(DSL)來聲明項目設置,而不是傳統的XML。Gradle構建腳本是用Groovy編寫的,也可以使用Kotlin編寫,兩者都是基於JVM的語言。
安裝 Gradle
在開始之前,想必大家已經學會了Java或者Kotlin,現在大家都在使用Android Studio開發Android應用,Android Studio是基於IntelliJ IDEA開發的,但現在不從Android Studio的角度來講,也不從IntelliJ IDEA的角度來講,而是從Gradle的角度來講,所以我們需要去官網下載Gradle,然後在IntelliJ IDEA中去使用Gradle。
首先去官網下載Gradle,下載地址:https://gradle.org/releases/,之後點擊最新版本中的binary-only,這會直接下載一個zip壓縮包,下載完成後解壓到一個目錄,然後再配置環境變量到bin目錄,這樣就可以在Terminal中使用gradle命令了,因為Java跨平台的緣故,在其他的操作系統上配置環境變量的方式都是大相不差的,這裏我就不再贅述了,如果不會配置環境變量的話,可以去網上搜索一下,這裏我就不再贅述了。
配置好環境變量之後,打開Terminal,輸入gradle -v,如果出現下面的信息,説明Gradle安裝成功了。
------------------------------------------------------------
Gradle 8.1
------------------------------------------------------------
Build time: 2023-04-12 12:07:45 UTC
Revision: 40ba32cde9d6daf2b92c39376d2758909dd6b813
Kotlin: 1.8.10
Groovy: 3.0.15
Ant: Apache Ant(TM) version 1.10.11 compiled on July 10 2021
JVM: 17.0.6 (BellSoft 17.0.6+10-LTS)
OS: Windows 10 10.0 amd64
創建 Hello World 項目
創建一個文件夾,然後在文件夾中打開Terminal,輸入gradle init,之後按照我的步驟來。
Select type of project to generate:
1: basic
2: application
3: library
4: Gradle plugin
Enter selection (default: basic) [1..4] 2 // 選擇 application
Select implementation language:
1: C++
2: Groovy
3: Java
4: Kotlin
5: Scala
6: Swift
Enter selection (default: Java) [1..6] 3 // 選擇 Java
Generate multiple subprojects for application? (default: no) [yes, no] // 默認 no
Select build script DSL:
1: Groovy
2: Kotlin
Enter selection (default: Groovy) [1..2] 2 // 選擇 Kotlin
Select test framework:
1: JUnit 4
2: TestNG
3: Spock
4: JUnit Jupiter
Enter selection (default: JUnit Jupiter) [1..4] //默認 JUnit Jupiter
Project name (default: gradle_learn):
Source package (default: gradle_learn): cn.enaium
Enter target version of Java (min. 7) (default: 17): // 默認 17
Generate build using new APIs and behavior (some features may change in the next minor release)? (default: no) [yes, no] // 默認 no
> Task :init
Get more help with your project: https://docs.gradle.org/8.1/samples/sample_building_java_applications.html
BUILD SUCCESSFUL in 32s // 構建成功
2 actionable tasks: 2 executed
如果最後出現BUILD SUCCESSFUL,説明項目創建成功了,現在我們來看一下項目的結構,這裏先簡單的介紹一下,後面會詳細的介紹。
│ .gitattributes // git 配置文件
│ .gitignore // git 配置文件
│ gradlew // gradle 腳本,當你沒有安裝 gradle 的時候,可以使用這個腳本來構建項目
│ gradlew.bat // windows 下的 gradlew 腳本
│ settings.gradle.kts // gradle 的settings配置文件
│
├─.gradle
├─app // 項目模塊,這是一個子項目
│ │ build.gradle.kts // app 模塊的 build 配置文件
│ │
│ └─src // app 模塊的源碼
│ ├─main
│ │ ├─java
│ │ │ └─cn
│ │ │ └─enaium
│ │ │ App.java
│ │ │
│ │ └─resources
│ └─test
│ ├─java
│ │ └─cn
│ │ └─enaium
│ │ AppTest.java
│ │
│ └─resources
└─gradle // gradle 的wrapper配置文件,當你沒有安裝 gradle 的時候,腳本會自使用wrapper來下載 gradle
└─wrapper
gradle-wrapper.jar
gradle-wrapper.properties // gradle 的wrapper配置文件,下載的 gradle 版本,下載地址等
運行項目,打開Terminal,輸入gradle run,如果出現下面的信息,説明項目運行成功了,這裏項目中自帶了一個Guava庫和JUnit庫,如果嫌下載太慢的話,可以自己去build.gradle.kts中刪除掉。
> Task :app:run
Hello World!
BUILD SUCCESSFUL in 10s
2 actionable tasks: 2 executed
刪掉
dependencies {
// Use JUnit Jupiter for testing.
testImplementation("org.junit.jupiter:junit-jupiter:5.9.1")
// This dependency is used by the application.
implementation("com.google.guava:guava:31.1-jre")
}
tasks.named<Test>("test") {
// Use JUnit Platform for unit tests.
useJUnitPlatform()
}
項目結構
settings.gradle.kts
settings.gradle.kts是Gradle的配置文件,這個文件中配置了項目的名稱和模塊,這裏的模塊指的是app模塊,這個模塊是Gradle默認創建的,如果你想創建其他的模塊,可以在這裏配置。
//這個是gradle創建時自帶的一個插件,這個插件可以自動下載jdk
plugins {
// Apply the foojay-resolver plugin to allow automatic download of JDKs
id("org.gradle.toolchains.foojay-resolver-convention") version "0.4.0"//插件的ID和版本,這裏的插件會從Gradle的插件倉庫中下載,結構和Maven倉庫類似
}
rootProject.name = "gradle_learn"//項目名稱
include("app")//包含的模塊
build.gradle.kts
在大部分情況下,都沒有使用App最為子模塊(除了Android項目),也就是直接從其中的src開始,項目結構如下。
│ build.gradle.kts // build 配置文件
│ settings.gradle.kts// settings 配置文件
│
├─gradle
│ └─wrapper
│ gradle-wrapper.jar
│ gradle-wrapper.properties
│
└─src // 源碼
├─main
└─test
但基本上都差不多,因為每個項目中都會有build.gradle.kts,這就是當前項目的build配置文件,這個文件中配置了項目的build信息,比如項目的group,version,dependencies等。
plugins {// 當前項目使用的插件,這裏如果有子項目,子項目也會使用這裏的插件
// Apply the application plugin to add support for building a CLI application in Java.
application // 應用插件,這個插件會自動創建一個`run`任務,用於運行項目
}
repositories {// 項目的倉庫,這裏的倉庫是用於下載依賴的,這裏的倉庫是`Maven`倉庫,也就是`Maven Central`
// Use Maven Central for resolving dependencies.
mavenCentral()
}
dependencies {// 項目的依賴,這裏的依賴是`Maven`倉庫中的依賴,這裏的依賴是`JUnit`和`Guava`
// Use JUnit Jupiter for testing.
testImplementation("org.junit.jupiter:junit-jupiter:5.9.1")// 測試依賴,testImplementation是測試依賴,implementation是應用依賴
// This dependency is used by the application.
implementation("com.google.guava:guava:31.1-jre")// 應用依賴,其中的字符串是`Maven`倉庫中的依賴,使用分號分割,第一個是`group`,第二個是`name`,第三個是`version`
}
// Apply a specific Java toolchain to ease working on different environments.
java {// java的配置,這裏配置了java的版本
toolchain {
languageVersion.set(JavaLanguageVersion.of(17))// java的版本
}
}
tasks.named<Test>("test") {// test任務的配置,這裏配置了test任務的使用的測試框架
// Use JUnit Platform for unit tests.
useJUnitPlatform()// 使用JUnit作為測試框架
}
//Application插件的配置,這裏配置了mainClass,也就是項目的入口類
application {
// Define the main class for the application.
mainClass.set("cn.enaium.App")// 入口類
}
gradle-wrapper.properties
# distributionBase 就是下載的gradle的存放位置,如果環境中沒有配置GRADLE_USER_HOME,那麼就會使用默認的位置,也就是當前用户的目錄下
distributionBase=GRADLE_USER_HOME
# distributionPath 就是下載的gradle的存放位置,也就是distributionBase的目錄中的wrapper/dists目錄
distributionPath=wrapper/dists
# distributionUrl 就是下載的gradle的地址,這裏的地址是gradle的官方地址,也就是https://services.gradle.org/distributions/gradle-8.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.1-bin.zip
# networkTimeout 就是下載gradle的超時時間,單位是毫秒
networkTimeout=10000
# 和上面同理
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
src
├─main
│ ├─java
│ │ └─cn
│ │ └─enaium
│ └─resources
└─test
├─java
│ └─cn
│ └─enaium
└─resources
這個目錄下的內容就是項目的源碼了,這裏的main和test兩個都是源碼目錄,只不過main是項目的源碼,test是項目的測試源碼,這兩個目錄下都有java和resources兩個目錄,java目錄下存放的是java源碼,resources目錄下存放的是資源文件,比如properties文件,xml文件等,這裏都是固定的格式,如果你想要自定義,可以在build.gradle.kts中配置,但本篇文章是簡單的入門,所以就不介紹了。
命令/任務
gradle tasks
這個命令是查看當前項目的所有任務,這個命令會列出所有的任務,包括Gradle自帶的任務,比如build,clean等,還有App模塊自帶的任務,比如run,test等,這裏只介紹一下比較常用的命令,其他的命令可以自行查看。
> Task :tasks //任務的名稱,這裏是tasks,也就是説查看所有任務也是一個任務
------------------------------------------------------------
Tasks runnable from root project 'gradle_learn'
------------------------------------------------------------
Application tasks// 任務的Group,這裏是Application,這個是Application插件自帶的任務
-----------------
run - Runs this project as a JVM application // 任務的名稱
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 main classes.
clean - Deletes the build directory.
jar - Assembles a jar archive containing the main classes.
testClasses - Assembles test classes.
Build Setup tasks
-----------------
init - Initializes a new Gradle build.
wrapper - Generates Gradle wrapper files.
Distribution tasks
------------------
assembleDist - Assembles the main distributions
distTar - Bundles the project as a distribution.
distZip - Bundles the project as a distribution.
installDist - Installs the project as a distribution as-is.
Documentation tasks
-------------------
javadoc - Generates Javadoc API documentation for the main source code.
Help tasks
----------
buildEnvironment - Displays all buildscript dependencies declared in root project 'gradle_learn'.
dependencies - Displays all dependencies declared in root project 'gradle_learn'.
dependencyInsight - Displays the insight into a specific dependency in root project 'gradle_learn'.
help - Displays a help message.
javaToolchains - Displays the detected java toolchains.
kotlinDslAccessorsReport - Prints the Kotlin code for accessing the currently available project extensions and conventions.
outgoingVariants - Displays the outgoing variants of root project 'gradle_learn'.
projects - Displays the sub-projects of root project 'gradle_learn'.
properties - Displays the properties of root project 'gradle_learn'.
resolvableConfigurations - Displays the configurations that can be resolved in root project 'gradle_learn'.
tasks - Displays the tasks runnable from root project 'gradle_learn' (some of the displayed tasks may belong to subprojects).
Verification tasks
------------------
check - Runs all checks.
test - Runs the test suite.
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 in 1s
1 actionable task: 1 executed
gradle run
這個命令是Application插件專有的命令,這個命令會運行Application插件配置的入口類,這裏的入口類是cn.enaium.App,也就是build.gradle.kts中配置的mainClass。
gradle init
也就是本篇文章最開始所用到的任務,這個任務會生成一個gradle項目。
gradle build
構建項目,這個命令會執行build.gradle.kts中配置的build任務,這個命令會生成一個build目錄,這個目錄下存放的是構建後的文件,比如jar文件,class文件等。
IntelliJ IDEA
導入項目
打開IntelliJ IDEA,點擊Open,選擇項目所在的目錄,點擊OK,這樣就可以導入項目了。
配置Gradle
基本上大多數的項目都不需要特意配置Gradle,打開設置中File> Settings> Build, Execution, Deployment> Build Tools> Gradle,這裏就是關於Gradle的配置,其中Gradle JVM是Gradle的JVM配置,也就是運行Gradle的JDK版本,之後打開IntelliJ IDEA右側的Gradle,可以看到所有的項目模塊還有所有任務,並且項目中所用到的依賴都會在這裏顯示出來,如果你想要運行某個任務,可以在這裏雙擊,也可以在Terminal中輸入gradle <task>,比如gradle run,這樣就可以運行run任務了。
總結
本篇文章主要介紹了Gradle的基本使用,包括Gradle的安裝,Gradle的目錄結構,Gradle的命令/任務,IntelliJ IDEA的配置,Gradle的配置,Gradle的使用,Gradle的插件,Gradle的依賴,Gradle的JVM配置,但是本篇文章只是簡單的介紹了一下,如果想要深入瞭解,可以查看Gradle官方文檔。