|
此版本仍在开发中,尚未被视为稳定版本。如需最新稳定版本,请使用 Spring Boot 4.0.4! |
开发您的第一个 GraalVM 原生应用
构建 Spring Boot 原生镜像应用程序主要有两种方式:
-
使用 Spring Boot 对云原生构建包的支持 以及 Paketo Java 原生镜像构建包 来生成一个包含原生可执行文件的轻量级容器。
-
使用 GraalVM 原生构建工具生成原生可执行文件。
启动新的原生 Spring Boot 项目最简单的方法是访问 start.spring.io,添加 GraalVM Native Support 依赖项并生成项目。
包含的 HELP.md 文件将提供入门提示。 |
示例应用程序
我们需要一个示例应用程序,可以用来创建我们的原生镜像。 对于我们的目的,开发您的第一个 Spring Boot 应用程序 部分中提到的简单的“Hello World!”网络应用程序就足够了。
回顾一下,我们的主要应用程序代码如下所示:
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 原生映像配合使用。
使用 Buildpacks 构建原生镜像
Spring Boot 支持构建包含原生可执行文件的 Docker 镜像,通过 Maven 和 Gradle 与 Cloud Native Buildpacks (CNB) 集成,并使用 Paketo Java Native Image buildpack。 这意味着你只需输入一条命令,即可快速将合理的镜像推送到本地运行的 Docker 守护进程中。 生成的镜像不包含 JVM,而是将原生镜像静态编译。 这使得镜像更小。
用于构建镜像的 CNB 构建器是 paketobuildpacks/builder-noble-java-tiny:latest。
它具有占用空间小和攻击面缩减的特点。它不包含 shell,并且只包含精简的系统库集合。
如果你需要在最终镜像中包含更多工具,可以使用 paketobuildpacks/ubuntu-noble-run:latest 作为 run 镜像。 |
| 你必须使用至少 JDK 25 来构建你的应用程序,因为 Buildpacks 使用的 GraalVM native-image 版本与编译使用的 Java 版本相同。 |
系统要求
应该安装Docker。有关更多详细信息,请参阅 获取Docker。 将其配置为允许非根用户 如果您使用的是Linux。
您可以运行 docker run hello-world(不带 sudo)以检查 Docker 守护进程是否按预期可达。
有关更多详细信息,请查阅 Maven 或 Gradle Spring Boot 插件文档。 |
在 macOS 上,建议将分配给 Docker 的内存增加到至少 8GB,并且可能还需要添加更多的 CPU。
有关更多详细信息,请参阅此 Stack Overflow 答案。
在 Microsoft Windows 上,请确保启用 Docker WSL 2 后端 以获得更好的性能。 |
使用 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>4.1.0-M3</version>
</parent>
此外,你还应在 <build> <plugins> 部分中包含以下内容:
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
</plugin>
spring-boot-starter-parent 声明了一个 native 配置文件,该配置文件配置了创建原生镜像所需执行的执行任务。
你可以使用命令行上的 -P 标志来激活配置文件。
如果您不想使用 spring-boot-starter-parent,则需要为 Spring Boot 插件的 process-aot 目标和 Native Build Tools 插件的 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。
只要应用了 org.graalvm.buildtools.native 插件,bootBuildImage 任务就会生成本地镜像,而不是 JVM 镜像。
你可以使用以下命令运行该任务:
$ 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。
使用原生构建工具构建原生镜像
如果你希望直接生成原生可执行文件而无需使用Docker,可以使用GraalVM Native Build Tools。 Native Build Tools是GraalVM为Maven和Gradle提供的插件。 你可以使用它们执行各种GraalVM任务,包括生成原生镜像。
前提条件
要使用原生构建工具构建原生镜像,您需要在计算机上安装一个GraalVM发行版。 您可以手动在 Liberica Native Image Kit 页面 下载,或者可以使用SDKMAN! 等下载管理器。
Linux 和 macOS
要在 macOS 或 Linux 上安装原生镜像编译器,我们建议使用 SDKMAN!。 从 sdkman.io 获取 SDKMAN!,并使用以下命令安装 Liberica GraalVM 发行版:
$ sdk install java 25.r25-nik
$ sdk use java 25.r25-nik
通过检查 java -version 的输出来验证是否已配置正确的版本:
$ java -version
openjdk version "25" 2025-09-16 LTS
OpenJDK Runtime Environment Liberica-NIK-25.0.0-1 (build 25+37-LTS)
OpenJDK 64-Bit Server VM Liberica-NIK-25.0.0-1 (build 25+37-LTS, mixed mode, sharing)
Windows
在 Windows 上,请按照 这些说明 安装版本 25 的 GraalVM 或 Liberica Native Image Kit,以及 Visual Studio 构建工具和 Windows SDK。 由于 与 Windows 相关的命令行最大长度,请确保使用 x64 本机工具命令提示符而不是常规的 Windows 命令行来运行 Maven 或 Gradle 插件。
使用 Maven
与构建包支持类似,您需要确保使用的是spring-boot-starter-parent以继承native配置文件,并且使用org.graalvm.buildtools:native-maven-plugin插件。
激活 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 :: (v4.1.0-M3)
....... . . .
....... . . . (log output here)
....... . . .
........ Started MyApplication in 0.08 seconds (process running for 0.095)
| 启动时间因机器而异,但应该比在 JVM 上运行的 Spring Boot 应用程序快得多。 |
如果您在 Web 浏览器中打开 localhost:8080,应该会看到以下输出:
Hello World!
要优雅地退出应用程序,请按 ctrl-c。