此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.3.1Spring中文文档

此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.3.1Spring中文文档

构建 Spring Boot 本机映像应用程序主要有两种方法:Spring中文文档

启动新的原生 Spring Boot 项目的最简单方法是转到 start.spring.io,添加依赖项并生成项目。 随附的文件将提供入门提示。GraalVM Native SupportHELP.md
启动新的原生 Spring Boot 项目的最简单方法是转到 start.spring.io,添加依赖项并生成项目。 随附的文件将提供入门提示。GraalVM Native SupportHELP.md

示例应用程序

我们需要一个示例应用程序,可以使用它来创建本机映像。 就我们的目的而言,开发您的第一个 Spring Boot 应用程序部分中介绍的简单 “Hello World!” Web 应用程序就足够了。Spring中文文档

回顾一下,我们的主要应用程序代码如下所示:Spring中文文档

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中文文档

使用 Buildpack 构建本机映像

Spring Boot 支持使用云原生构建包 (CNB) 与 Maven 和 Gradle 以及 Paketo Java Native Image 构建包的集成来构建包含本机可执行文件的 Docker 映像。 这意味着您只需键入一个命令,即可快速将合理的映像导入到本地运行的 Docker 守护程序中。 生成的映像不包含 JVM,而是静态编译本机映像。 这会导致图像变小。Spring中文文档

用于映像的 CNB 生成器是 。 它占用空间小,攻击面小,但如果需要,您还可以在映像中使用或提供更多工具。paketobuildpacks/builder-jammy-tiny:latestpaketobuildpacks/builder-jammy-base:latestpaketobuildpacks/builder-jammy-full:latest

系统要求

应安装 Docker。有关详细信息,请参阅获取 Docker。如果您使用的是 Linux,请将其配置为允许非 root 用户Spring中文文档

您可以运行(不使用 )来检查 Docker 守护程序是否按预期访问。 有关更多详细信息,请查看 MavenGradle Spring Boot 插件文档。docker run hello-worldsudo
在 macOS 上,建议将分配给 Docker 的内存增加到至少 ,并可能添加更多 CPU。 有关更多详细信息,请参阅此 Stack Overflow 答案。 在 Microsoft Windows 上,请确保启用 Docker WSL 2 后端以获得更好的性能。8GB

使用 Maven

要使用 Maven 构建本机映像容器,应确保文件使用 和 . 您应该有一个如下所示的部分:pom.xmlspring-boot-starter-parentorg.graalvm.buildtools:native-maven-plugin<parent>Spring中文文档

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

此外,您还应该在以下部分包含此内容:<build> <plugins>Spring中文文档

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

声明一个配置文件,用于配置需要运行的执行,以创建本机映像。 您可以使用命令行上的标志激活配置文件。spring-boot-starter-parentnative-PSpring中文文档

如果您不想使用,则需要为 Spring Boot 插件中的目标和本机构建工具插件中的目标配置执行。spring-boot-starter-parentprocess-aotadd-reachability-metadata

若要生成映像,可以在配置文件处于活动状态的情况下运行目标:spring-boot:build-imagenativeSpring中文文档

$ mvn -Pnative spring-boot:build-image

使用 Gradle

Spring Boot Gradle 插件在应用 GraalVM Native Image 插件时自动配置 AOT 任务。 您应该检查您的 Gradle 版本是否包含包含 的块。pluginsorg.graalvm.buildtools.nativeSpring中文文档

只要应用了插件,任务就会生成一个本机映像,而不是一个 JVM 映像。 您可以使用以下命令运行任务:org.graalvm.buildtools.nativebootBuildImageSpring中文文档

$ gradle bootBuildImage

运行示例

运行相应的生成命令后,Docker 映像应该可用。 您可以使用以下命令启动应用程序:docker runSpring中文文档

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

您应看到类似于以下内容的输出:Spring中文文档

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: 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:8080Spring中文文档

Hello World!

要正常退出应用程序,请按 。ctrl-cSpring中文文档

用于映像的 CNB 生成器是 。 它占用空间小,攻击面小,但如果需要,您还可以在映像中使用或提供更多工具。paketobuildpacks/builder-jammy-tiny:latestpaketobuildpacks/builder-jammy-base:latestpaketobuildpacks/builder-jammy-full:latest
您可以运行(不使用 )来检查 Docker 守护程序是否按预期访问。 有关更多详细信息,请查看 MavenGradle Spring Boot 插件文档。docker run hello-worldsudo
在 macOS 上,建议将分配给 Docker 的内存增加到至少 ,并可能添加更多 CPU。 有关更多详细信息,请参阅此 Stack Overflow 答案。 在 Microsoft Windows 上,请确保启用 Docker WSL 2 后端以获得更好的性能。8GB
如果您不想使用,则需要为 Spring Boot 插件中的目标和本机构建工具插件中的目标配置执行。spring-boot-starter-parentprocess-aotadd-reachability-metadata
启动时间因计算机而异,但应该比在 JVM 上运行的 Spring Boot 应用程序快得多。

使用本机生成工具生成本机映像

如果要在不使用 Docker 的情况下直接生成本机可执行文件,则可以使用 GraalVM 本机构建工具。 原生构建工具是 GraalVM 为 Maven 和 Gradle 提供的插件。 您可以使用它们来执行各种 GraalVM 任务,包括生成本机映像。Spring中文文档

先决条件

要使用本机构建工具构建本机映像,您需要在计算机上安装 GraalVM 发行版。 您可以在 Liberica Native Image Kit 页面上手动下载它,也可以使用像 SDKMAN! 这样的下载管理器。Spring中文文档

Linux 和 macOS

要在 macOS 或 Linux 上安装本机映像编译器,我们建议使用 SDKMAN!。 获取 SDKMAN!从 sdkman.io 并使用以下命令安装 Liberica GraalVM 发行版:Spring中文文档

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

通过检查以下输出来验证是否配置了正确的版本:java -versionSpring中文文档

$ 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 上,按照以下说明在版本 22.3、Visual Studio 生成工具和 Windows SDK 中安装 GraalVMLiberica Native Image Kit。 由于与 Windows 相关的命令行最大长度,请确保使用 x64 本机工具命令提示符而不是常规 Windows 命令行来运行 Maven 或 Gradle 插件。Spring中文文档

使用 Maven

构建包支持一样,您需要确保使用以继承配置文件并使用插件。spring-boot-starter-parentnativeorg.graalvm.buildtools:native-maven-pluginSpring中文文档

激活配置文件后,可以调用目标来触发编译:nativenative:compilenative-imageSpring中文文档

$ mvn -Pnative native:compile

本机映像可执行文件可以在目录中找到。targetSpring中文文档

使用 Gradle

将 Native Build Tools Gradle 插件应用于您的项目后,Spring Boot Gradle 插件将自动触发 Spring AOT 引擎。 任务依赖是自动配置的,因此您只需运行标准任务即可生成本机映像:nativeCompileSpring中文文档

$ gradle nativeCompile

本机映像可执行文件可以在目录中找到。build/native/nativeCompileSpring中文文档

运行示例

此时,您的应用程序应该可以正常工作。现在,您可以通过直接运行应用程序来启动应用程序:Spring中文文档

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

您应看到类似于以下内容的输出:Spring中文文档

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

如果打开 Web 浏览器,应看到以下输出:localhost:8080Spring中文文档

Hello World!

要正常退出应用程序,请按 。ctrl-cSpring中文文档

启动时间因计算机而异,但应该比在 JVM 上运行的 Spring Boot 应用程序快得多。