使用 Gradle init 建立 Java 應用程式,了解 Gradle 的基礎知識。

在本節中,您將會

  • 初始化新的 Gradle 專案

  • 建置專案

  • 檢閱 Gradle 的專案結構

  • 在 IntelliJ IDEA 中開啟專案

  • 探索 Gradle 檔案和建置指令碼

  • 了解 Gradle wrapper

步驟 0. 開始之前

  1. 請確定您已安裝 Gradle

  2. 安裝IntelliJ IDEA。Community Edition 是 IntelliJ IDEA 的免費版本。

步驟 1. 初始化專案

若要測試 Gradle 安裝,請從命令列執行 Gradle

$ gradle

Welcome to Gradle 8.6.

Directory '/' does not contain a Gradle build.

To create a new build in this directory, run gradle init

如果未安裝 Gradle,請參閱安裝區段

建立一個名為 tutorial 的新目錄,並 cd 進入該目錄

$ mkdir tutorial
$ cd tutorial

使用下列參數執行 gradle init 來產生 Java 應用程式

$ gradle init --type java-application  --dsl kotlin
$ gradle init --type java-application  --dsl groovy

針對任何其他提示選擇預設值。

在本教學課程中,所有範例都基於 macOS。

完成後,目錄應如下所示

.
├── .gradle                 (1)
│   ├── libs.version.toml   (2)
│   └── ⋮
├── gradle                  (3)
│   └── wrapper
├── gradlew                 (4)
├── gradlew.bat             (5)
├── settings.gradle.kts     (6)
├── app                     (7)
│   ├── build.gradle.kts
│   └── src
└── ⋮                       (8)
1 由 Gradle 產生的專案特定快取目錄。
2 版本目錄,在集中位置定義一組相依性的版本。
3 包含 Gradle Wrapper 的 JAR 檔案和組態。
4 使用 Gradle Wrapper 執行建置的 macOS 和 Linux 指令碼。
5 使用 Gradle Wrapper 執行建置的 Windows 指令碼。
6 專案的設定檔,其中定義子專案清單。
7 Java 應用程式的原始程式碼和建置設定。
8 可能會存在一些額外的 Git 檔案,例如 .gitignore
.
├── .gradle                 (1)
│   ├── libs.version.toml   (2)
│   └── ⋮
├── gradle                  (3)
│   └── wrapper
├── gradlew                 (4)
├── gradlew.bat             (5)
├── settings.gradle         (6)
├── app                     (7)
│   ├── build.gradle
│   └── src
└── ⋮                       (8)
1 由 Gradle 產生的專案特定快取目錄。
2 版本目錄,在集中位置定義一組相依性的版本。
3 包含 Gradle Wrapper 的 JAR 檔案和組態。
4 使用 Gradle Wrapper 執行建置的 macOS 和 Linux 指令碼。
5 使用 Gradle Wrapper 執行建置的 Windows 指令碼。
6 專案的設定檔,其中定義子專案清單。
7 Java 應用程式的原始程式碼和建置設定。
8 可能會存在一些額外的 Git 檔案,例如 .gitignore

步驟 2. 了解 Gradle Wrapper

Gradle Wrapper 是啟動 Gradle 建置的優先方式。Wrapper 會下載(如果需要)並呼叫建置中宣告的特定 Gradle 版本。

在您新建立的專案中,先看看 Gradle Wrapper 使用的檔案。它包含 macOS 和 Linux 的 shell 指令碼,以及 Windows 的批次指令碼。

這些指令碼讓您可以在系統上未安裝 Gradle 的情況下執行 Gradle 建置。它也有助於確保不同開發人員和本機與 CI 機器之間的建置使用相同版本的 Gradle。

從現在開始,您將永遠不會直接呼叫 Gradle;而是使用 Gradle wrapper

步驟 3. 呼叫 Gradle Wrapper

輸入下列指令來使用 wrapper

$ ./gradlew build

在 Windows 中,指令為

$ .\gradlew.bat build

您第一次執行 wrapper 時,它會下載並快取 Gradle 二進位檔(如果尚未安裝在您的機器上)。

Gradle Wrapper 的設計目的是提交至原始程式碼控制,以便任何人都可以在不先安裝和設定特定 Gradle 版本的情況下建置專案。

在這個案例中,我們透過 wrapper 呼叫 Gradle 來建置我們的專案,因此我們可以看到 app 目錄現在包含一個新的 build 資料夾

$ cd app
$ ls -al
drwxr-xr-x  10 gradle-user  staff  320 May 24 18:07 build
-rw-r--r--   1 gradle-user  staff  862 May 24 17:45 build.gradle.kts
drwxr-xr-x   4 gradle-user  staff  128 May 24 17:45 src
drwxr-xr-x  10 gradle-user  staff  320 May 24 18:07 build
-rw-r--r--   1 gradle-user  staff  862 May 24 17:45 build.gradle
drwxr-xr-x   4 gradle-user  staff  128 May 24 17:45 src

除非另有指定,否則建置程序產生的所有檔案都會進入 build 目錄。

步驟 4. 了解 Gradle 的專案結構

我們來看一下標準的 Gradle 專案結構,並將其與我們的教學專案進行比較

project structure

一個 建置包含

  1. 頂層 settings.gradle(.kts) 檔案。

  2. 一個 根專案

  3. 一個或多個 子專案,每個子專案都有自己的 build.gradle(.kts) 檔案。

有些建置可能會在根專案中包含 build.gradle(.kts) 檔案,但不建議這樣做。

libs.version.toml 檔案是一個版本目錄,用於相依性管理,您將在教學的後續部分中瞭解它。

在本教學中

  1. 根專案稱為教學課程,並在 settings.gradle 檔案中以 rootProject.name = "tutorial" 定義。

  2. 子專案稱為應用程式,並在 settings.gradle 檔案中以 include("app") 定義。

根專案可以位於頂層目錄或擁有自己的目錄。

一個建置

  • 代表一組相關軟體,您可以同時建置、測試和/或發布這些軟體。

  • 可以選擇包含其他建置(例如其他軟體,例如函式庫、外掛程式、建置時間工具等)。

一個專案

  • 代表您的架構中的單一區塊 - 函式庫、應用程式、Gradle 外掛程式等。

  • 可以選擇包含其他專案。

步驟 5. 在 IDE 中檢視 Gradle 檔案

透過在 tutorial 目錄中雙擊 settings.gradle.kts 檔案,在 IntelliJ IDEA 中開啟專案。對於 Groovy DSL 使用者,您可能需要在按一下 settings.gradle 檔案時選取 IntelliJ IDEA 應用程式

intellij idea ide

在 IDE 中開啟 settings.gradle(.kts)build.gradle(.kts) 檔案

intellij idea open

步驟 6. 了解設定檔

一個專案由一個或多個子專案(有時稱為模組)組成。

Gradle 會讀取 settings.gradle(.kts) 檔案,找出哪些子專案組成專案建置。

查看專案中的檔案

settings.gradle.kts
plugins {
    // Apply the foojay-resolver plugin to allow automatic download of JDKs
    id("org.gradle.toolchains.foojay-resolver-convention") version "0.7.0"
}

rootProject.name = "tutorial"
include("app")
settings.gradle
plugins {
    // Apply the foojay-resolver plugin to allow automatic download of JDKs
    id 'org.gradle.toolchains.foojay-resolver-convention' version '0.7.0'
}

rootProject.name = 'tutorial'
include('app')

tutorial 根專案包含 app 子專案。include 呼叫的存在會將 app 目錄轉換為子專案。

步驟 7. 了解建置指令碼

每個子專案包含自己的 build.gradle(.kts) 檔案。

build.gradle(.kts) 檔案是建置程序的核心元件,並定義建置專案所需的任務。

build.gradle(.kts) 檔案由 Gradle 讀取並執行。

仔細查看 app 子專案(位於 app 目錄下)中的建置檔案

build.gradle.kts
plugins {
    // Apply the application plugin to add support for building a CLI application in Java.
    application
}

repositories {
    // Use Maven Central for resolving dependencies.
    mavenCentral()
}

dependencies {
    // Use JUnit Jupiter for testing.
    testImplementation(libs.junit.jupiter)

    testRuntimeOnly("org.junit.platform:junit-platform-launcher")

    // This dependency is used by the application.
    implementation(libs.guava)
}

// Apply a specific Java toolchain to ease working on different environments.
java {
    toolchain {
        languageVersion.set(JavaLanguageVersion.of(11))
    }
}

application {
    // Define the main class for the application.
    mainClass.set("running.tutorial.kotlin.App")
}

tasks.named<Test>("test") {
    // Use JUnit Platform for unit tests.
    useJUnitPlatform()
}
build.gradle
plugins {
    // Apply the application plugin to add support for building a CLI application in Java.
    id 'application'
}

repositories {
    // Use Maven Central for resolving dependencies.
    mavenCentral()
}

dependencies {
    // Use JUnit Jupiter for testing.
    testImplementation libs.junit.jupiter

    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'

    // This dependency is used by the application.
    implementation libs.guava
}

// Apply a specific Java toolchain to ease working on different environments.
java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(11)
    }
}

application {
    // Define the main class for the application.
    mainClass = 'running.tutorial.groovy.App'
}

tasks.named('test') {
    // Use JUnit Platform for unit tests.
    useJUnitPlatform()
}

此建置指令碼讓 Gradle 知道 app 子專案使用哪些相依項和外掛,以及在哪裡可以找到它們。我們將在後續章節中更詳細地探討這一點。

下一步: 執行任務 >>