开发你的第一个GraalVM原生应用
构建 Spring Boot 原生映像应用主要有两种方式:
-
利用 Spring Boot 支持云原生构建包,配合 Paketo Java 原生映像构建包生成一个包含原生可执行文件的轻量级容器。
-
使用 GraalVM 原生构建工具生成原生可执行文件。
启动一个新的原生 Spring Boot 项目最简单的方法是进入 start.spring.io,添加GraalVM 原生支持依赖关系并生成项目。
包含的HELP.md文件会提供入门提示。 |
示例应用
我们需要一个示例应用程序,可以用来创建我们的原生镜像。 就我们而言,开发你的第一个春季靴子应用部分介绍的简单“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 原生映像。
使用构建包构建原生镜像
Spring Boot 支持构建包含原生可执行文件的 Docker 镜像,使用与 Maven 和 Gradle 的 Cloud Native Buildpacks(CNB)集成,以及 Paketo Java 原生映像构建包。 这意味着你只需输入一个命令,就能快速将一个合理的镜像导入本地运行的 Docker 守护进程。 最终生成的镜像不包含JVM,而是静态编译的原生镜像。 这导致图像变小。
用于图像的CNB构建器是Paketobuildpacks/builder-noble-java-tiny:最新.
它体积小,攻击面也更小。它不包含 shell,且包含简化的系统库集。
如果你需要更多工具,可以用paketobuildpacks/ubuntu-noble-run:最新作为跑步画面。 |
| 你必须至少用 JDK 25 构建你的应用,因为构建包使用的是和编译用的 Java 版本相同的 GraalVM 原生映像版本。 |
系统需求
应该安装Docker。详情请参见Get Docker。如果你用的是Linux,可以设置成允许非root用户访问。
在macOS上,建议至少将分配给Docker的内存增加到8GB,并且可能还会增加更多CPU。
更多细节请参见Stack Overflow的回答。
在 Microsoft Windows 上,确保启用 Docker WSL 2 后端以提升性能。 |
使用 Maven
要用 Maven 构建原生图片容器,你应该确保你的pom.xml文件使用Spring靴启动父以及org.graalvm.buildtools:native-maven-plugin.
你应该有<家长>该部分看起来像这样:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>4.0.0</version>
</parent>
你还应该在<build> <plugins>部分:
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
</plugin>
这Spring靴启动父宣告本地配置配置文件,配置需要运行的执行内容以创建原生映像。
你可以用-P命令行标记。
如果你不想用Spring靴启动父你需要配置执行进程进攻的进攻Spring Boot插件中的目标和添加可达性元数据目标来自Native Build Tools插件。 |
要构建镜像,你可以运行Spring Boot:构建映像目标本地个人资料活跃:
$ mvn -Pnative spring-boot:build-image
使用 Gradle
当应用GraalVM原生映像插件时,Spring Boot Gradle插件会自动配置AOT任务。
你应该检查你的Gradle构建是否包含插件该块包括org.graalvm.buildtools.native.
只要org.graalvm.buildtools.native插件被应用,启动构建图像任务将生成原生图像,而非JVM图像。
你可以用以下方式来完成这个任务:
$ gradle bootBuildImage
运行示例
运行了相应的构建命令后,应该会有一个 Docker 镜像可用。
你可以用以下方式开始申请Docker 运行:
$ 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应用快得多。 |
如果你打开网页浏览器本地主持人:8080你应该会看到以下输出:
Hello World!
要优雅地退出应用,请按ctrl-c.
使用原生构建工具构建原生图像
如果你想直接生成原生可执行文件而不使用Docker,可以使用GraalVM原生构建工具。 原生构建工具是GraalVM为Maven和Gradle自带的插件。 你可以用它们执行各种 GraalVM 任务,包括生成原生镜像。
前提条件
要用原生构建工具构建原生镜像,你需要在你的机器上安装 GraalVM 发行版。 你可以在Liberica原生图像套件页面手动下载,或者使用像SDKMAN!这样的下载管理器。
Linux 和 macOS
在macOS或Linux上安装原生映像编译器时,我们建议使用SDKMAN!。 去找SDKMAN!从 sdkman.io 下载并使用以下命令安装Liberica GraalVM发行版:
$ sdk install java 25.r25-nik
$ sdk use java 25.r25-nik
通过检查 的输出来确认配置正确版本Java 版本:
$ 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上,按照以下说明安装GraalVM或Liberica原生Image Kit(版本25)、Visual Studio构建工具和Windows SDK。 由于Windows相关的命令行最大长度限制,请务必使用x64原生工具命令提示符,而非普通Windows命令行来运行Maven或Gradle插件。
使用 Maven
和构建包支持一样,你需要确保你使用的是Spring靴启动父为了继承本地剖面,且org.graalvm.buildtools:native-maven-plugin使用了插件。
与本地配置文件激活时,你可以调用本地:编译目标触发原生图像汇编:
$ mvn -Pnative native:compile
本地镜像可执行文件可在目标目录。
使用 Gradle
当 Native Build Tools 的 Gradle 插件应用到你的项目时,Spring Boot Gradle 插件会自动触发 Spring AOT 引擎。
任务依赖是自动配置的,所以你只需运行标准程序即可原生编译生成原生图像的任务:
$ gradle nativeCompile
本地镜像可执行文件可在build/native/nativeCompile目录。
运行示例
此时,你的申请应该可以正常工作了。你现在可以通过直接运行应用程序来启动它:
-
Maven
-
Gradle
$ target/myproject
$ build/native/nativeCompile/myproject
你应该会看到类似以下的输出:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v4.0.0)
....... . . .
....... . . . (log output here)
....... . . .
........ Started MyApplication in 0.08 seconds (process running for 0.095)
| 启动时间因机器而异,但应该比运行在JVM上的Spring Boot应用快得多。 |
如果你打开网页浏览器本地主持人:8080你应该会看到以下输出:
Hello World!
要优雅地退出应用,请按ctrl-c.