通过运行一个任务并查看其输出,了解 Gradle 任务的基本知识。

在本部分中,您将

  • 查看可用任务

  • 运行任务并检查结果

  • 了解任务

  • 探索任务依赖关系

步骤 0. 开始之前

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

步骤 1. 查看可用任务

任务 是 Gradle 可以作为构建一部分执行的基本工作单元。

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.

...

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

您还可以通过运行 ./gradlew :app:tasks 来列出仅在 app 子项目中可用的任务。

您可以使用 --all 选项在任务列表中获取更多信息:./gradlew tasks --all

在本教程的 第 1 部分 中,我们使用 ./gradlew build 命令运行了 build 任务。

步骤 2. 了解任务

我们列出了项目初始化时可用的任务,但如果我们想要创建自己的任务怎么办?

Gradle 提供了许多内置任务,开发人员可以使用这些任务来增强构建脚本。

此示例任务使用 Copy 内置任务将 *.war 文件从 source 目录复制到 target 目录。

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

如果将此任务添加到 app 子项目目录中的 build.gradle(.kts) 文件,则将使用命令 ./gradlew :app:copyTask 执行此任务。

常用的内置任务包括

  • Copy - Copy 可用于复制文件。

  • Delete - Delete 可用于删除文件和目录。

  • Exec - Exec 可用于执行任意 O/S 命令。

  • Zip - Zip 可用于捆绑文件。

还有许多其他任务在 Kotlin 和 Groovy DSL 中进行了记录。

步骤 3. 了解任务之间的依赖关系

很多时候,一个任务需要另一个任务先运行。如果任务 B 使用任务 A 的输出,则任务 A 必须在任务 B 开始之前完成。

  • 任务可以显式声明其依赖关系。

  • 任务可以隐式依赖于其他任务。

以下是一个显式任务依赖关系的示例

tasks.register("hello") {
    doLast {
        println('Hello!')
    }
}

tasks.register("greet") {
    doLast {
        println('How are you?')
    }
    dependsOn("hello")
}
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 中运行任务

你可以通过在窗格中双击 Gradle 任务在 IntelliJ 中运行该任务。

双击教程 > 应用 > 构建 > 构建

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”打印到屏幕上

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

下一步: 依赖项管理 >>