概述

Spring Boot Gradle 插件为Gradle提供了对Spring Boot的支持。它允许我们打包可执行的JAR或WAR归档文件,运行Spring Boot应用,并利用由spring-boot-dependencies提供的依赖管理。Spring Boot 3的Gradle插件需要Gradle 7.x(7.5及以上版本)或8.x,并且可以与Gradle的配置缓存一起使用。

在本教程中,我们将学习如何配置Spring Boot 3 Gradle插件的任务。Spring Boot 3 Gradle插件提供了多个任务,我们将使用一个简单的Spring Boot应用来演示如何配置这些任务。为了演示目的,我们的Spring Boot应用不会添加任何安全或数据特性。现在,让我们详细了解一下如何定义和配置这些任务。

1. 配置bootJar Gradle任务

在Spring Boot 3 Gradle插件中,与之前版本相比,Gradle任务得到了改进。常见的任务包括bootJarbootWarbootRunbootBuildImage。现在,我们深入探讨bootJar任务及其配置方法。

要在build.gradle文件中配置bootJar任务,我们需要添加一个bootJar配置块

tasks.named("bootJar") {
    launchScript{
        enabled = true
    }
    enabled = true
    archiveFileName = "bael-6094.${archiveExtension.get()}"
}

这个配置块设置了bootJar任务的几个选项。

属性launchScript会在生成的JAR中创建一个启动脚本,使得我们可以像运行其他命令一样运行JAR。例如,无需显式使用java -jar <jarname>,我们就可以直接使用jarname./jarname来运行JAR。要禁用bootjar任务,只需将属性enabled设置为false,其默认值为true

我们可以通过archiveFileName属性定义输出JAR的名称。现在,我们已经准备好运行bootJar任务了:

gradlew bootJar

这将在build/libs目录下生成一个完全可执行的JAR。在我们的例子中,JAR的名称将是bael-6094.jar

2. 层叠JAR生成

Spring Boot Gradle插件支持构建层叠JAR。这有助于减少内存使用并促进关注点分离。

让我们配置bootJar任务以使用层叠架构。我们将JAR分为两个层:application层和springBoot层:

bootJar {
    layered {
        enabled = true
        application {
            layer = 'application'
            dependencies {
                // Add any dependencies that should be included in the application layer
            }
        }
        springBoot {
            layer = 'spring-boot'
        }
    }
}

在这个示例中,层叠功能已启用,并且定义了两个层:application层和spring-bootapplication层包含应用程序代码和指定的依赖项,而spring-boot层包含Spring Boot框架及其依赖。

接下来,我们使用bootJar任务构建Spring Boot应用:

./gradlew bootJar

这将在build/libs目录下生成一个名为{projectName}-{projectVersion}-layers.jar的层叠JAR文件。

通过将应用程序代码与Spring Boot框架代码分开,我们获得了更快的启动时间和更低的内存使用。此外,在我们的层叠JAR文件中,我们有独立的应用程序和框架层。因此,我们可以跨多个应用共享框架层,从而减少代码重复和资源消耗。

3. 配置bootBuildImage任务

现在,让我们使用bootBuildImage任务来构建我们的Docker镜像。新插件使用Cloud Native Buildpacks (CNB) 创建OCI镜像

bootBuildImage任务需要访问docker守护进程。它默认会通过本地连接与docker守护进程通信,这适用于所有支持平台上的Docker引擎,无需特殊配置。我们可以通过环境变量如DOCKER_HOSTDOCKER_TLS_VERIFYDOCKER_CERT_PATH等更改默认设置。此外,我们还可以使用插件配置不同的属性。

build.gradle中添加一个带有自定义配置的典型bootBuildImage任务:

tasks.named("bootBuildImage") {
    imageName = 'bael-6094:latest'
}

接下来,运行bootBuildImage命令:

gradlew.bat bootBuildImage

确保我们的docker服务在操作系统上正在运行。无论是在Windows、Linux还是macOS,Docker都提供了支持。运行bootBuildImage任务后,我们在Docker环境中得到了一个镜像。让我们列出本地环境中的可用Docker镜像,以验证我们新构建的镜像:

docker images

现在,我们准备好运行容器:

docker run -p 8080:8080 bael-6094:latest

-p 8080:8080将主机端口8080映射到容器端口8080。默认情况下,Spring Boot在容器内部的8080端口上运行我们的应用,并将其暴露给外部映射。bootBuildImage任务还有许多其他可用于不同特性的配置选项。

现在,让我们在浏览器中访问http://localhost:8080/hello来验证输出。

4. 结论

在这篇文章中,我们介绍了Spring Boot 3 Gradle插件的一些任务。这些任务相较于以往版本有许多改进。如往常一样,文章的代码可以在GitHub上找到。