此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.3.4! |
此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.3.4! |
构建 Spring Boot 本机映像应用程序有两种主要方法:
-
将 Spring Boot 对云原生 Buildpacks 的支持与 Paketo Java Native Image buildpack 结合使用,以生成包含本机可执行文件的轻量级容器。
-
使用 GraalVM Native Build Tools 生成原生可执行文件。
启动新的原生 Spring Boot 项目的最简单方法是转到 start.spring.io,添加依赖项并生成项目。
包含的文件将提供入门提示。GraalVM Native Support HELP.md |
启动新的原生 Spring Boot 项目的最简单方法是转到 start.spring.io,添加依赖项并生成项目。
包含的文件将提供入门提示。GraalVM Native Support HELP.md |
示例应用程序
我们需要一个示例应用程序,我们可以使用它来创建我们的原生镜像。 就我们的目的而言,开发您的第一个 Spring Boot 应用程序中介绍的简单 “Hello World!” Web 应用程序就足够了。
概括地说,我们的主要应用程序代码如下所示:
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 原生映像配合使用。
使用 Buildpack 构建原生镜像
Spring Boot 支持使用云原生构建包 (CNB) 与 Maven 和 Gradle 的集成以及 Paketo Java 原生镜像构建包来构建包含原生可执行文件的 Docker 镜像。 这意味着您只需键入一个命令,即可快速将合理的映像获取到本地运行的 Docker 守护程序中。 生成的映像不包含 JVM,而是静态编译本机映像。 这会导致图像更小。
用于映像的 CNB 生成器是 .
它占用空间小,攻击面更小,但如果需要,您也可以在映像中使用或拥有更多可用工具。paketobuildpacks/builder-jammy-tiny:latest paketobuildpacks/builder-jammy-base:latest paketobuildpacks/builder-jammy-full:latest |
系统要求
应该安装 Docker。有关更多详细信息,请参阅获取 Docker。如果您使用的是 Linux,请将其配置为允许非 root 用户。
您可以运行 (没有 ) 来检查 Docker 守护进程是否按预期可访问。
有关更多详细信息,请查看 Maven 或 Gradle Spring Boot 插件文档。docker run hello-world sudo |
在 macOS 上,建议将分配给 Docker 的内存至少增加到 ,并可能添加更多 CPU。
有关更多详细信息,请参阅此 Stack Overflow 答案。
在 Microsoft Windows 上,请确保启用 Docker WSL 2 后端以获得更好的性能。8GB |
使用 Maven
要使用 Maven 构建本机映像容器,应确保您的文件使用 和 .
您应该有一个如下所示的部分:pom.xml
spring-boot-starter-parent
org.graalvm.buildtools:native-maven-plugin
<parent>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.4.0-SNAPSHOT</version>
</parent>
您还应该在以下部分包含以下内容:<build> <plugins>
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
</plugin>
声明一个配置文件,用于配置创建本机映像所需的执行。
您可以使用命令行上的 标志激活配置文件。spring-boot-starter-parent
native
-P
如果您不想使用,则需要为 Spring Boot 插件中的目标和 Native Build Tools 插件中的目标配置执行。spring-boot-starter-parent process-aot add-reachability-metadata |
要构建图像,您可以在配置文件处于活动状态的情况下运行目标:spring-boot:build-image
native
$ mvn -Pnative spring-boot:build-image
使用 Gradle
Spring Boot Gradle 插件在应用 GraalVM Native Image 插件时自动配置 AOT 任务。
您应该检查您的 Gradle 构建是否包含包含 .plugins
org.graalvm.buildtools.native
只要应用了插件,该任务就会生成本机映像,而不是 JVM 映像。
您可以使用以下方法运行任务:org.graalvm.buildtools.native
bootBuildImage
$ gradle bootBuildImage
运行示例
运行适当的构建命令后,Docker 镜像应该可用。
您可以使用以下方法启动应用程序:docker run
$ docker run --rm -p 8080:8080 docker.io/library/myproject:0.0.1-SNAPSHOT
您应该会看到类似于以下内容的输出:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: 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
Hello World!
要正常退出应用程序,请按 。ctrl-c
用于映像的 CNB 生成器是 .
它占用空间小,攻击面更小,但如果需要,您也可以在映像中使用或拥有更多可用工具。paketobuildpacks/builder-jammy-tiny:latest paketobuildpacks/builder-jammy-base:latest paketobuildpacks/builder-jammy-full:latest |
您可以运行 (没有 ) 来检查 Docker 守护进程是否按预期可访问。
有关更多详细信息,请查看 Maven 或 Gradle Spring Boot 插件文档。docker run hello-world sudo |
在 macOS 上,建议将分配给 Docker 的内存至少增加到 ,并可能添加更多 CPU。
有关更多详细信息,请参阅此 Stack Overflow 答案。
在 Microsoft Windows 上,请确保启用 Docker WSL 2 后端以获得更好的性能。8GB |
如果您不想使用,则需要为 Spring Boot 插件中的目标和 Native Build Tools 插件中的目标配置执行。spring-boot-starter-parent process-aot add-reachability-metadata |
启动时间因计算机而异,但应该比在 JVM 上运行的 Spring Boot 应用程序快得多。 |
使用 Native Build Tools 构建 Native Image
如果您想在不使用 Docker 的情况下直接生成原生可执行文件,可以使用 GraalVM 原生构建工具。 原生构建工具是 GraalVM 为 Maven 和 Gradle 提供的插件。 您可以使用它们来执行各种 GraalVM 任务,包括生成原生映像。
先决条件
要使用原生构建工具构建原生镜像,您的机器上需要有 GraalVM 发行版。 您可以在 Liberica Native Image Kit 页面上手动下载它,也可以使用 SDKMAN! 等下载管理器。
Linux 和 macOS
要在 macOS 或 Linux 上安装原生镜像编译器,我们建议使用 SDKMAN!。 获取 SDKMAN!sdkman.io 并使用以下命令安装 Liberica GraalVM 发行版:
$ sdk install java 22.3.r17-nik
$ sdk use java 22.3.r17-nik
通过检查以下各项的输出来验证是否配置了正确的版本:java -version
$ 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 上,请按照这些说明安装 GraalVM 或 Liberica Native Image Kit 版本 22.3、Visual Studio 构建工具和 Windows SDK。 由于 Windows 相关的命令行最大长度,请确保使用 x64 本机工具命令提示符而不是常规 Windows 命令行来运行 Maven 或 Gradle 插件。
使用 Maven
与 buildpacks 支持一样,您需要确保您正在使用以继承配置文件,并且使用了插件。spring-boot-starter-parent
native
org.graalvm.buildtools:native-maven-plugin
在配置文件处于活动状态的情况下,您可以调用 goal 来触发编译:native
native:compile
native-image
$ mvn -Pnative native:compile
本机映像可执行文件可以在目录中找到。target
使用 Gradle
当 Native Build Tools Gradle 插件应用到您的项目时,Spring Boot Gradle 插件将自动触发 Spring AOT 引擎。
任务依赖关系是自动配置的,因此您只需运行标准任务即可生成本机映像:nativeCompile
$ gradle nativeCompile
本机映像可执行文件可以在目录中找到。build/native/nativeCompile
运行示例
此时,您的应用程序应该可以正常工作。现在,您可以通过直接运行应用程序来启动应用程序:
-
Maven
-
Gradle
$ target/myproject
$ build/native/nativeCompile/myproject
您应该会看到类似于以下内容的输出:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v3.4.0-SNAPSHOT)
....... . . .
....... . . . (log output here)
....... . . .
........ Started MyApplication in 0.08 seconds (process running for 0.095)
启动时间因计算机而异,但应该比在 JVM 上运行的 Spring Boot 应用程序快得多。 |
如果打开 Web 浏览器,您应该会看到以下输出:localhost:8080
Hello World!
要正常退出应用程序,请按 。ctrl-c
启动时间因计算机而异,但应该比在 JVM 上运行的 Spring Boot 应用程序快得多。 |