第2部分:运行 Gradle 任务
通过运行一个任务并查看其输出来学习 Gradle 任务的基础知识。
步骤 0. 开始之前
-
您在第 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
任务依赖于 compileJava
、processResources
和 test
,这确保在最终构建打包之前完成代码编译、资源处理和测试运行。
如果要列出特定子项目中的可用任务,可以使用 ./gradlew :<subproject name>:tasks
。要列出 app
子项目中的任务
$ ./gradlew :app:tasks
您可以通过添加 --all
选项查看更多任务
$ ./gradlew tasks --all
$ ./gradlew :app:tasks --all
这显示了通常在默认摘要中隐藏的内部任务和生命周期任务。
步骤 2. 理解任务
任务可以来自几个地方。Gradle 默认包含一些任务,而许多其他任务在应用插件时会自动添加。
如果您还记得教程的第 1 部分,我们 Java 应用的构建脚本应用了 application
插件
plugins { (1)
// Apply the application plugin to add support for building a CLI application in Java.
application
}
plugins { (1)
// Apply the application plugin to add support for building a CLI application in Java.
id 'application'
}
应用 application
插件会添加诸如 run
、build
、compileJava
、test
和 jar
等任务。
您还可以在构建脚本中使用 tasks.register()
方法定义自己的自定义任务,并使用 Gradle 的任务 API 配置任务的功能。
Gradle 提供了几种内置任务类型,可以轻松执行常见操作,例如复制文件、归档输出或运行命令。
例如,Copy
任务类型用于将文件从一个位置复制到另一个位置,作为构建的一部分。
以下是如何注册一个自定义任务,该任务将所有 .war
文件从源目录复制到目标目录
tasks.register<Copy>("copyTask") {
from("source")
into("target")
include("*.war")
}
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。这种关系称为任务依赖。
任务依赖有两种类型
-
显式依赖:一个任务直接声明它依赖于另一个任务。
-
隐式依赖:Gradle 会自动确定顺序,因为一个任务使用了另一个任务的输出(例如编译后的类文件)。
这是一个显式任务依赖的示例
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")
}
在这种情况下,hello
在 greet
之前打印。输出是 Hello! How are you?
。
任务执行顺序由 Gradle 自动确定,同时考虑了显式和隐式任务依赖。如果任务之间没有依赖关系,Gradle 允许用户请求特定的执行顺序。
步骤 5. 在 IDE 中运行任务(可选)
您可以通过在面板中双击任务来在 IntelliJ 中运行 Gradle 任务。
双击 tutorial > app > build > 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"
package org.example;
public class App {
public String getGreeting() {
return "Hello World!";
}
public static void main(String[] args) {
System.out.println(new App().getGreeting());
}
}
下一步: 依赖管理 >>