博客 / 詳情

返回

Gradle極簡入門

首發於Enaium的個人博客


什麼是 Gradle

Gradle是一個基於Apache AntApache Maven概念的項目自動化構建工具。它使用一種基於Groovy的特定領域語言(DSL)來聲明項目設置,而不是傳統的XMLGradle構建腳本是用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.ktsGradle的配置文件,這個文件中配置了項目的名稱和模塊,這裏的模塊指的是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信息,比如項目的groupversiondependencies等。

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

這個目錄下的內容就是項目的源碼了,這裏的maintest兩個都是源碼目錄,只不過main是項目的源碼,test是項目的測試源碼,這兩個目錄下都有javaresources兩個目錄,java目錄下存放的是java源碼,resources目錄下存放的是資源文件,比如properties文件,xml文件等,這裏都是固定的格式,如果你想要自定義,可以在build.gradle.kts中配置,但本篇文章是簡單的入門,所以就不介紹了。

命令/任務

gradle tasks

這個命令是查看當前項目的所有任務,這個命令會列出所有的任務,包括Gradle自帶的任務,比如buildclean等,還有App模塊自帶的任務,比如runtest等,這裏只介紹一下比較常用的命令,其他的命令可以自行查看。

> 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 JVMGradleJVM配置,也就是運行GradleJDK版本,之後打開IntelliJ IDEA右側的Gradle,可以看到所有的項目模塊還有所有任務,並且項目中所用到的依賴都會在這裏顯示出來,如果你想要運行某個任務,可以在這裏雙擊,也可以在Terminal中輸入gradle <task>,比如gradle run,這樣就可以運行run任務了。

總結

本篇文章主要介紹了Gradle的基本使用,包括Gradle的安裝,Gradle的目錄結構,Gradle的命令/任務,IntelliJ IDEA的配置,Gradle的配置,Gradle的使用,Gradle的插件,Gradle的依賴,GradleJVM配置,但是本篇文章只是簡單的介紹了一下,如果想要深入瞭解,可以查看Gradle官方文檔。

user avatar an_653b347d1d3da 頭像 codingdgsun 頭像 tracy_5cb7dfc1f3f67 頭像 knifeblade 頭像 91cyz 頭像 gozhuyinglong 頭像 longbig 頭像 jacheut 頭像 chengxuyuanxiaohui 頭像 codecraft 頭像 beiyinglunkuo 頭像 yaoyuandefeng 頭像
13 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.