第 1 部分:初始化项目
通过使用 Gradle init 创建 Java 应用,了解编写 Gradle 的基础知识。
步骤 0. 开始之前
-
确保已安装 Gradle。
-
安装IntelliJ IDEA。社区版是 IntelliJ IDEA 的免费版本。
步骤 1. 初始化项目
创建一个名为 authoring-tutorial
的新目录,并 cd
进入该目录
$ mkdir authoring-tutorial
$ cd authoring-tutorial
使用参数运行 gradle init
以生成 Java 应用程序
$ gradle init --type java-application --dsl kotlin
$ gradle init --type java-application --dsl groovy
为任何其他提示选择默认值。
在本教程中,所有示例均基于 macOS。 |
步骤 2. 了解目录布局
项目根目录包含项目中的所有源文件。
当您完成 Gradle init
时,目录应如下所示
.
├── gradle (1)
├── libs.version.toml (2)
│ └── wrapper
├── gradlew (3)
├── gradlew.bat (3)
├── settings.gradle.kts (4)
└── app
├── build.gradle.kts (5)
└── src
├── main
│ └── java (6)
│ └── demo
│ └── App.java
└── test
└── java (7)
└── demo
└── AppTest.java
1 | 包装器文件的生成文件夹 |
2 | 依赖项的版本目录 |
3 | Gradle 包装器启动脚本 |
4 | 定义构建名称和子项目的设置文件 |
5 | app 子项目的构建脚本 |
6 | app 子项目的默认 Java 源文件夹 |
7 | app 子项目的默认 Java 测试源文件夹 |
.
├── gradle (1)
├── libs.version.toml (2)
│ └── wrapper
├── gradlew (3)
├── gradlew.bat (3)
├── settings.gradle (4)
└── app
├── build.gradle (5)
└── src
├── main
│ └── java (6)
│ └── demo
│ └── App.java
└── test
└── java (7)
└── demo
└── AppTest.java
1 | 包装器文件的生成文件夹 |
2 | 依赖项的版本目录 |
3 | Gradle 包装器启动脚本 |
4 | 定义构建名称和子项目的设置文件 |
5 | app 子项目的构建脚本 |
6 | app 子项目的默认 Java 源文件夹 |
7 | app 子项目的默认 Java 测试源文件夹 |
authoring-tutorial
文件夹是根项目目录。根项目目录中有一个或多个子项目、构建脚本和 Gradle 包装器。
虽然 Gradle 包装器是根项目的本地,但 Gradle 可执行文件位于 GRADLE_USER_HOME
中。
GRADLE_USER_HOME
(默认为 USER_HOME/.gradle
)也是 Gradle 存储其全局配置属性、初始化脚本、缓存、日志文件等的位置。
步骤 3. 查看 Gradle 文件
settings.gradle(.kts)
文件有两行有趣的内容
rootProject.name = "authoring-tutorial"
include("app")
rootProject.name = 'authoring-tutorial'
include('app')
-
rootProject.name
为构建分配一个名称,覆盖了根据目录名称为构建命名这一默认行为。 -
include("app")
定义构建包含一个名为app
的子项目,其中包含它自己的源代码和构建逻辑。
可以通过其他 include()
语句添加更多子项目。
我们的构建包含一个名为 app
的子项目,表示我们正在构建的 Java 应用程序。它在 app/build.gradle(.kts)
文件中配置
plugins {
id("application") (1)
}
repositories {
mavenCentral() (2)
}
dependencies {
testImplementation(libs.junit.jupiter) (3)
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
implementation(libs.guava) (4)
}
java {
toolchain {
languageVersion = JavaLanguageVersion.of(11) (5)
}
}
application {
mainClass = "org.example.App" (6)
}
tasks.named<Test>("test") {
useJUnitPlatform() (7)
}
1 | 应用应用程序插件以添加对在 Java 中构建 CLI 应用程序的支持。 |
2 | 使用 Maven Central 来解析依赖项。 |
3 | 使用 JUnit Jupiter 进行测试(使用版本目录)。 |
4 | 此依赖项由应用程序使用(使用版本目录引用)。 |
5 | 定义工具链版本。 |
6 | 定义应用程序的主类。 |
7 | 对单元测试使用 JUnit Platform。 |
plugins {
id 'application' (1)
}
repositories {
mavenCentral() (2)
}
dependencies {
testImplementation libs.junit.jupiter (3)
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
implementation libs.guava (4)
}
java {
toolchain {
languageVersion = JavaLanguageVersion.of(11) (5)
}
}
application {
mainClass = 'org.example.App' (6)
}
tasks.named('test') {
useJUnitPlatform() (7)
}
1 | 应用应用程序插件以添加对在 Java 中构建 CLI 应用程序的支持。 |
2 | 使用 Maven Central 来解析依赖项。 |
3 | 使用 JUnit Jupiter 进行测试(使用版本目录)。 |
4 | 此依赖项由应用程序使用(使用版本目录引用)。 |
5 | 定义工具链版本。 |
6 | 定义应用程序的主类。 |
7 | 对单元测试使用 JUnit Platform。 |
app
子项目目录中的构建脚本声明了 app
代码需要组装和测试的依赖项。
步骤 4. 查看代码
文件 app/src/main/java/authoring/tutorial/App.java
包含项目的 main 类
package authoring.tutorial;
public class App {
public String getGreeting() {
return "Hello World!";
}
public static void main(String[] args) {
System.out.println(new App().getGreeting());
}
}
代码会打印一个简单的“Hello World”问候语到屏幕上。
测试类位于app/src/test/java/authoring/tutorial/AppTest.java
package authoring.tutorial;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class AppTest {
@Test void appHasAGreeting() {
App classUnderTest = new App();
assertNotNull(classUnderTest.getGreeting(), "app should have a greeting");
}
}
生成的测试类有一个单一的JUnit Jupiter测试。该测试实例化App
类,调用其上的一个方法,并检查它是否返回了预期值。
步骤 5. 运行应用程序
Application 插件(由gradle init
自动添加)有助于创建可执行的 JVM 应用程序
plugins {
id("application")
}
plugins {
id 'application'
}
应用 Application 插件会隐式应用 Java 插件,并向我们的项目添加assemble
、build
和run
等任务。
借助application
插件,您可以直接从命令行运行应用程序。run
任务告诉 Gradle 执行分配给mainClass
属性的类中的main
方法。
$ ./gradlew run
> Task :app:run
Hello World!
BUILD SUCCESSFUL in 998ms
2 actionable tasks: 2 executed
步骤 6. 捆绑应用程序
application
插件为您打包应用程序及其所有依赖项。该存档还将包含一个脚本,只需一条命令即可启动应用程序。
运行./gradlew build
$ ./gradlew build
> Task :app:compileJava
> Task :app:processResources NO-SOURCE
> Task :app:classes
> Task :app:jar
> Task :app:startScripts
> Task :app:distTar
> Task :app:distZip
> Task :app:assemble
> Task :app:compileTestJava
> Task :app:processTestResources NO-SOURCE
> Task :app:testClasses
> Task :app:test
> Task :app:check
> Task :app:build
BUILD SUCCESSFUL in 5s
如果您如上所示运行完整构建,Gradle 将生成两种格式的存档:app/build/distributions/app.tar
和app/build/distributions/app.zip
。
步骤 6. 发布构建扫描
了解构建在幕后执行的操作的最佳方式是发布构建扫描。为此,请再次使用--scan
标志运行build
任务。
$ ./gradlew build --scan
> Task :app:compileJava UP-TO-DATE
> Task :app:processResources NO-SOURCE
> Task :app:classes UP-TO-DATE
> Task :app:jar UP-TO-DATE
> Task :app:startScripts UP-TO-DATE
> Task :app:distTar UP-TO-DATE
> Task :app:distZip UP-TO-DATE
> Task :app:assemble UP-TO-DATE
> Task :app:compileTestJava UP-TO-DATE
> Task :app:processTestResources NO-SOURCE
> Task :app:testClasses UP-TO-DATE
> Task :app:test UP-TO-DATE
> Task :app:check UP-TO-DATE
> Task :app:build UP-TO-DATE
BUILD SUCCESSFUL in 1s
7 actionable tasks: 7 up-to-date
Resolving local hostname is slow, see https://gradle.com/help/gradle-slow-host-name
Publishing a build scan to scans.gradle.com requires accepting the Gradle Terms of Service defined at https://gradle.com/terms-of-service. Do you accept these terms? [yes, no] yes
Gradle Terms of Service accepted.
Publishing build scan...
https://gradle.com/s/link
单击链接并探索执行了哪些任务、下载了哪些依赖项以及更多详细信息
下一步: 构建生命周期 >>