一、引入graalvm组件

在任意SpringBoot项目的基础上,引入以下graalvm的maven插件:

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

二、使用SpringBoot插件构建镜像

spring-boot-maven-plugin插件下的build-image执行目标提供了一键生成镜像的功能,如下所示:

mvn -Pnative spring-boot:build-image

执行该命令需要先启动Docker,执行完成后,会自动生成Docker镜像。

在构建镜像的过程中,会自动下载paketobuildpacks/builder-jammy-tinypaketobuildpacks/run-jammy-tiny这两个辅助镜像。

ARM架构的MacBook电脑可能会执行失败,推测是当前(20231209)还没有完成适配,可暂时使用x86机器,或采用GraalVM插件完成构建。

spring-boot-maven-plugin插件使用Buildpacks完成镜像构建。上述命令中的native配置参数由spring-boot-starter-parent提供,其引入了两个maven执行目标:spring-boot-maven-plugin下的process-aotnative-maven-plugin下的add-reachability-metadata,具体内容可详见spring-boot-starter-parent的pom.xml文件。如果不想引入spring-boot-starter-parent,也可手动配置process-aoadd-reachability-metadata

执行完上述命令后,运行容器,并验证应用:

docker run --rm -p 8080:8080 app:1.0-SNAPSHOT
curl http://localhost:8080

三、使用GraalVM插件构建镜像

native-maven-plugin插件下的compile执行目标提供了一键生成二进制可执行文件的功能,如下所示:

mvn -Pnative native:compile

执行该命令需要先下载并配置参考GraalVM:首先,在GraalVM官方网站下载并安装GraalVM,随后设置JAVA_HOME环境变量。执行完成后,会在target目录下生成二进制可执行文件。

Windwos系统可能需要下载VisualStudio才能执行成功,可使用Linux或Mac操作系统完成构建。

运行可执行文件,并验证应用:

./target/app
curl http://localhost:8080

后续也可将该二进制可执行文件打入Docker镜像,当前暂不支持交叉编译,建议在Linux操作系统下完成构建。

参考文档

  1. SpringBoot GraalVM Native Image Support
  2. GraalVM官方网站