此版本仍在开发中,尚未视为稳定版。如需最新稳定版本,请使用 Spring Boot 4.0.4spring-doc.cadn.net.cn

开发您的第一个 GraalVM 原生应用程序

构建 Spring Boot 原生镜像应用程序主要有两种方式:spring-doc.cadn.net.cn

启动一个新的原生 Spring Boot 项目的最简单方法是访问 start.spring.io,添加 GraalVM Native Support 依赖项,然后生成项目。 其中包含的 HELP.md 文件将提供入门提示。

示例应用程序

我们需要一个示例应用程序,用于创建我们的原生镜像。 就我们的目的而言,《开发你的第一个 Spring Boot 应用程序》一节中介绍的简单“Hello World!” Web 应用程序就足够了。spring-doc.cadn.net.cn

回顾一下,我们的主应用程序代码如下所示:spring-doc.cadn.net.cn

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@SpringBootApplication
public class MyApplication {

	@RequestMapping("/")
	String home() {
		return "Hello World!";
	}

	public static void main(String[] args) {
		SpringApplication.run(MyApplication.class, args);
	}

}

本应用程序使用了 Spring MVC 和嵌入式 Tomcat,这两者均已通过测试并验证可与 GraalVM 原生镜像配合使用。spring-doc.cadn.net.cn

使用 Buildpacks 构建原生镜像

Spring Boot 支持使用云原生构建包(Cloud Native Buildpacks,CNB)与 Maven 和 Gradle 集成,并结合 Paketo Java Native Image 构建包,构建包含原生可执行文件的 Docker 镜像。 这意味着你只需输入一条命令,就能快速将一个合理的镜像推送到本地运行的 Docker 守护进程中。 生成的镜像不包含 JVM,而是将原生镜像静态编译而成。 这使得镜像体积更小。spring-doc.cadn.net.cn

用于构建镜像的 CNB 构建器是 paketobuildpacks/builder-noble-java-tiny:latest。 该构建器占用空间小,攻击面也更小。它不包含 shell,并且仅包含精简版的系统库。 如果你需要在生成的镜像中包含更多工具,可以使用 paketobuildpacks/ubuntu-noble-run:latest 作为运行镜像。

系统要求

应已安装 Docker。更多详情请参见 获取 Docker。 如果您使用的是 Linux,请配置 Docker 以允许非 root 用户spring-doc.cadn.net.cn

你可以运行 docker run hello-world(无需使用 sudo)来检查 Docker 守护进程是否如预期那样可访问。 有关更多详细信息,请参阅 MavenGradle Spring Boot 插件文档。
在 macOS 上,建议将分配给 Docker 的内存增加到至少 8GB,并可能同时增加 CPU 核心数。 更多详情请参见此Stack Overflow 回答。 在 Microsoft Windows 上,请确保启用Docker WSL 2 后端以获得更好的性能。

使用 Maven

要使用 Maven 构建原生镜像容器,您应确保您的 pom.xml 文件使用了 spring-boot-starter-parentorg.graalvm.buildtools:native-maven-plugin。 您应具有如下所示的 <parent> 部分:spring-doc.cadn.net.cn

<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>3.5.13-SNAPSHOT</version>
</parent>

此外,您还应在 <build> <plugins> 部分中包含此项:spring-doc.cadn.net.cn

<plugin>
	<groupId>org.graalvm.buildtools</groupId>
	<artifactId>native-maven-plugin</artifactId>
</plugin>

spring-boot-starter-parent 声明了一个 native 配置文件(profile),用于配置生成原生镜像所需执行的任务。 你可以使用命令行中的 -P 标志来激活配置文件。spring-doc.cadn.net.cn

如果你不想使用 spring-boot-starter-parent,则需要为 Spring Boot 插件的 process-aot 目标和 Native Build Tools 插件的 add-reachability-metadata 目标配置执行项。

要构建镜像,您可以运行 spring-boot:build-image 目标,并激活 native 配置文件:spring-doc.cadn.net.cn

$ mvn -Pnative spring-boot:build-image

使用 Gradle

当应用 GraalVM Native Image 插件时,Spring Boot Gradle 插件会自动配置 AOT 任务。 您应检查您的 Gradle 构建文件中是否包含一个 plugins 块,并且其中包含 org.graalvm.buildtools.nativespring-doc.cadn.net.cn

只要应用了 org.graalvm.buildtools.native 插件,bootBuildImage 任务就会生成一个原生镜像,而不是 JVM 镜像。 你可以使用以下命令运行该任务:spring-doc.cadn.net.cn

$ gradle bootBuildImage

运行示例

一旦您运行了相应的构建命令,Docker 镜像就应该可用。 您可以使用 docker run 启动您的应用程序:spring-doc.cadn.net.cn

$ docker run --rm -p 8080:8080 docker.io/library/myproject:0.0.1-SNAPSHOT

您应该会看到类似于以下的内容:spring-doc.cadn.net.cn

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::  (v{version-spring-boot})
....... . . .
....... . . . (log output here)
....... . . .
........ Started MyApplication in 0.08 seconds (process running for 0.095)
启动时间因机器而异,但应比在 JVM 上运行的 Spring Boot 应用程序快得多。

如果您在web浏览器中打开localhost:8080,您应该会看到以下输出:spring-doc.cadn.net.cn

Hello World!

要优雅地退出应用,请按 ctrl-cspring-doc.cadn.net.cn

使用原生构建工具构建原生镜像

如果你想在不使用 Docker 的情况下直接生成原生可执行文件,可以使用 GraalVM 原生构建工具。 原生构建工具是 GraalVM 为 Maven 和 Gradle 提供的插件。 你可以使用它们执行各种 GraalVM 任务,包括生成原生镜像。spring-doc.cadn.net.cn

前置条件

要使用 Native Build Tools 构建原生镜像,您需要在机器上安装 GraalVM 发行版。 您可以手动从Liberica Native Image Kit 页面下载,也可以使用 SDKMAN! 等下载管理器。spring-doc.cadn.net.cn

Linux 和 macOS

要在 macOS 或 Linux 上安装原生镜像编译器,我们推荐使用 SDKMAN! 请从 sdkman.io 获取 SDKMAN!,并使用以下命令安装 Liberica GraalVM 发行版:spring-doc.cadn.net.cn

$ sdk install java 22.3.r17-nik
$ sdk use java 22.3.r17-nik

通过检查 java -version 命令的输出,验证是否已配置了正确的版本:spring-doc.cadn.net.cn

$ java -version
openjdk version "17.0.5" 2022-10-18 LTS
OpenJDK Runtime Environment GraalVM 22.3.0 (build 17.0.5+8-LTS)
OpenJDK 64-Bit Server VM GraalVM 22.3.0 (build 17.0.5+8-LTS, mixed mode)

Windows

在 Windows 上,请按照这些说明安装 22.3 版本的GraalVMLiberica Native Image Kit、Visual Studio 生成工具以及 Windows SDK。 由于Windows 相关的命令行最大长度限制,请务必使用 x64 Native Tools 命令提示符,而非普通的 Windows 命令行来运行 Maven 或 Gradle 插件。spring-doc.cadn.net.cn

使用 Maven

buildpacks 支持一样,你需要确保使用了 spring-boot-starter-parent 以继承 native 配置文件,并且使用了 org.graalvm.buildtools:native-maven-plugin 插件。spring-doc.cadn.net.cn

启用 native 配置文件后,您可以调用 native:compile 目标来触发 native-image 编译:spring-doc.cadn.net.cn

$ mvn -Pnative native:compile

原生镜像可执行文件位于 target 目录中。spring-doc.cadn.net.cn

使用 Gradle

当 Native Build Tools Gradle 插件被应用到您的项目时,Spring Boot Gradle 插件将自动触发 Spring AOT 引擎。 任务依赖项会自动配置,因此您只需运行标准的 nativeCompile 任务即可生成原生镜像:spring-doc.cadn.net.cn

$ gradle nativeCompile

原生镜像可执行文件位于 build/native/nativeCompile 目录中。spring-doc.cadn.net.cn

运行示例

此时,您的应用程序应该可以正常运行了。您现在可以通过直接运行来启动该应用程序:spring-doc.cadn.net.cn

$ target/myproject
$ build/native/nativeCompile/myproject

您应该会看到类似于以下的内容:spring-doc.cadn.net.cn

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::  (v3.5.13-SNAPSHOT)
....... . . .
....... . . . (log output here)
....... . . .
........ Started MyApplication in 0.08 seconds (process running for 0.095)
启动时间因机器而异,但应比在 JVM 上运行的 Spring Boot 应用程序快得多。

如果您在web浏览器中打开localhost:8080,您应该会看到以下输出:spring-doc.cadn.net.cn

Hello World!

要优雅地退出应用,请按 ctrl-cspring-doc.cadn.net.cn