通过运行一个任务并查看其输出来学习 Gradle 任务的基础知识。

在本节中,您将:

  • 查看可用任务

  • 运行任务并检查结果

  • 理解任务

  • 探索任务依赖

步骤 0. 开始之前

  1. 您在第 1 部分中初始化了您的 Java 应用。

步骤 1. 查看可用任务

任务 (task) 是 Gradle 在构建过程中可以完成的基本工作单元。

任务可能负责编译、复制和移动文件、创建 JAR 文件、生成 Javadoc、将制品发布到仓库,或许多其他独立的工作单元。

tutorial 目录中,输入以下命令以列出项目中的所有可用任务

$ ./gradlew tasks

此列表包括由 application 插件及其应用的插件贡献的任务

Application tasks
-----------------
run - Runs this project as a JVM application

Build tasks
-----------
assemble - Assembles the outputs of this project.
build - Assembles and tests this project.

...

Documentation tasks
-------------------
javadoc - Generates Javadoc API documentation for the main source code.

...

Other tasks
-----------
compileJava - Compiles main Java source.

...

任务是构建过程的基本组成部分。每个任务代表 Gradle 可以执行的特定操作,并且任务可以根据其依赖关系进行组合和排序。

例如,您在教程的第 1 部分中运行的 build 任务依赖于 compileJavaprocessResourcestest,这确保在最终构建打包之前完成代码编译、资源处理和测试运行。

如果要列出特定子项目中的可用任务,可以使用 ./gradlew :<subproject name>:tasks。要列出 app 子项目中的任务

$ ./gradlew :app:tasks

您可以通过添加 --all 选项查看更多任务

$ ./gradlew tasks --all
$ ./gradlew :app:tasks --all

这显示了通常在默认摘要中隐藏的内部任务和生命周期任务。

步骤 2. 理解任务

任务可以来自几个地方。Gradle 默认包含一些任务,而许多其他任务在应用插件时会自动添加。

如果您还记得教程的第 1 部分,我们 Java 应用的构建脚本应用了 application 插件

app/build.gradle.kts
plugins {   (1)
    // Apply the application plugin to add support for building a CLI application in Java.
    application
}
app/build.gradle
plugins {   (1)
    // Apply the application plugin to add support for building a CLI application in Java.
    id 'application'
}

应用 application 插件会添加诸如 runbuildcompileJavatestjar 等任务。

您还可以在构建脚本中使用 tasks.register() 方法定义自己的自定义任务,并使用 Gradle 的任务 API 配置任务的功能。

Gradle 提供了几种内置任务类型,可以轻松执行常见操作,例如复制文件、归档输出或运行命令。

例如,Copy 任务类型用于将文件从一个位置复制到另一个位置,作为构建的一部分。

以下是如何注册一个自定义任务,该任务将所有 .war 文件从源目录复制到目标目录

app/build.gradle.kts
tasks.register<Copy>("copyTask") {
    from("source")
    into("target")
    include("*.war")
}
app/build.gradle
tasks.register("copyTask", Copy) {
    from("source")
    into("target")
    include("*.war")
}

如果此任务在 app 子项目的 build.gradle(.kts) 文件中定义,您可以使用以下命令运行它

$ ./gradlew :app:copyTask

Gradle 将执行该任务,并将它在源目录中找到的任何 .war 文件复制到目标目录中。

常见的内置任务包括

  • Copy - Copy 任务对于复制文件很有用。

  • Delete - Delete 任务对于删除文件和目录很有用。

  • Exec - Exec 任务对于执行任意操作系统命令很有用。

  • Zip - Zip 任务对于打包文件很有用。

在 Kotlin 和 Groovy DSL 中还有更多任务有详细文档。

步骤 3. 理解任务间的依赖

通常,一个任务需要另一个任务先运行。例如,创建 JAR 文件的任务必须等到代码编译完成后才能运行。

如果任务 B 需要任务 A 的输出,那么 Gradle 必须在运行任务 B 之前运行任务 A。这种关系称为任务依赖。

任务依赖有两种类型

  1. 显式依赖:一个任务直接声明它依赖于另一个任务。

  2. 隐式依赖:Gradle 会自动确定顺序,因为一个任务使用了另一个任务的输出(例如编译后的类文件)。

这是一个显式任务依赖的示例

app/build.gradle.kts
tasks.register("hello") {
    doLast {
        println("Hello!")
    }
}

tasks.register("greet") {
    doLast {
        println("How are you?")
    }
    dependsOn("hello")
}
app/build.gradle
tasks.register("hello") {
    doLast {
        println('Hello!')
    }
}

tasks.register("greet") {
    doLast {
        println('How are you?')
    }
    dependsOn("hello")
}

在这种情况下,hellogreet 之前打印。输出是 Hello! How are you?

任务执行顺序由 Gradle 自动确定,同时考虑了显式和隐式任务依赖。如果任务之间没有依赖关系,Gradle 允许用户请求特定的执行顺序。

步骤 4. 在 IDE 中查看任务(可选)

项目任务在 IntelliJ 中也可用。按照教程的第 1 部分打开项目。

在窗口的右侧,打开 Gradle 面板以查看所有可用任务

intellij idea tasks

步骤 5. 在 IDE 中运行任务(可选)

您可以通过在面板中双击任务来在 IntelliJ 中运行 Gradle 任务。

双击 tutorial > app > build > build

intellij idea build

构建完成后,请确保它在 IntelliJ 控制台中成功完成

BUILD SUCCESSFUL in 966ms
7 actionable tasks: 7 executed
3:18:24 AM: Execution finished 'build'.

步骤 6. 在终端中运行任务

在您的终端中运行以下命令

$ ./gradlew build
> Task :app:compileJava
> Task :app:processResources
> Task :app:classes
> Task :app:jar
> Task :app:startScripts
> Task :app:distTar
> Task :app:distZip
> Task :app:assemble
> Task :app:compileTestJava
> Task :app:processTestResources
> Task :app:testClasses
> Task :app:test
> Task :app:check
> Task :app:build

build 任务使用源代码及其依赖项来构建应用。从输出中可以看出,build 任务负责编译、组装、测试和检查代码。

任务按执行顺序打印。jar 任务是 build 任务的依赖项。

jar 任务创建应用的可执行 JAR 文件。让我们单独运行它

$ ./gradlew jar
> Task :app:compileJava
> Task :app:processResources
> Task :app:classes
> Task :app:jar

如预期,compileJava 任务是 jar 任务的依赖项并首先执行。任务完成后,会在您的 tutorial/app/build/libs/ 文件夹中创建一个 app.jar 文件。

调用 run 任务并检查输出

$ ./gradlew run
> Task :app:compileJava
> Task :app:processResources
> Task :app:classes

> Task :app:run
Hello World!

BUILD SUCCESSFUL in 325ms

run 任务执行 tutorial/app/src/main/java/com.gradle.tutorial/App.java 中的代码。

您可以花一分钟查看 App.java 中的 Java 代码,该代码只是简单地在屏幕上打印 "Hello World"

app/src/main/java/org/example/App.java
package org.example;

public class App {
    public String getGreeting() {
        return "Hello World!";
    }
    public static void main(String[] args) {
        System.out.println(new App().getGreeting());
    }
}

下一步: 依赖管理 >>