Windows 11上安装和使用GraalVM+SpringBoot3教程
spring官方有关GraalVm相关文档: GraalVM Native Image Support
安装GraalVM
下载压缩包
打开Releases · graalvm/graalvm-ce-builds · GitHub 按JDK版本下载GraalVM对应压缩包
配置环境变量
直接解压,并将环境变量中的JAVA_HOME的值替换为graalvm的安装目录
安装Visual Studio Build Tools
需要用到C语言环境,所以需要安装Visual Studio Build Tools
打开 Thank you for downloading Visual Studio - Visual Studio
进行下载,语言包只需要勾选英语。
测试
以管理员方式运行 X64 Native Tools Command Propmt
实在找不到这个的,可以直接在安装程序里启动
cli.exe
# 如果显示的是中文的话,需要修改成英文,通过Visual Studio Installer来修改,语言包,把原来打勾的中文选项去掉,只勾选英文选项
执行cl.exe是中文,需要切换成英文语言。
创建一个springboot3项目
可以在http://start.spring.io快速生成springboot项目
POM.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>springboot3-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot3-demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>19</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
生成exe可执行文件
1、打开X64 Native Tools Command Propmt窗口执行:
#先进入到对应的项目目录
cd C:\Users\tanhh\Desktop\springboot3\code\springboot3-demo
# 生成exe命令
mvn -Pnative native:compile
错误一:
找不到cl.exe,这个可能是没有安装Visual Studio Build Tools, 也可能是没有在X64 Native Tools Command Propmt窗口下执行。
错误二:
执行过程中出现下面错误信息:
[ERROR] Failed to execute goal org.graalvm.buildtools:native-maven-plugin:0.9.20:compile (default-cli) on project springboot3-demo: Execution of D:\develop\graalvm-ce-java19-22.3.1\bin\native-image.cmd @target\tmp\native-image-9198299026073687163.args returned non-zero result -> [Help 1]
根据错误找到了 @target\tmp\native-image-9198299026073687163.args这个文件,即target包下面的临时参数文件
实际上这个是因为安装 Visual Studio Build Tools的时候,语言包没有设置成英文的原因,可以看得出来啊,实际上生成执行exe分成了两个步骤去执行,首先需要生成 参数,在通过native-image操作执行参数
native-image @target\tmp\native-image-9198299026073687163.args
错误三:
查看上面的切换语言包为英文即可
测试,秒启
利用Buildpacks构建可执行文件Docker
可以直接对本地可执行文件构建成镜像文件,这样就可以跨操作系统运行了,目前只支持到17,如果jdk设置成19,会出现报错。
Buildpacks,类似Dockerfile镜像构建技术
需要安装docker并启动docker
这种方式并不需要在机器上安装GGraalVM,会由springboot插件利用 /paketo-buildpacks/native-image来生成可执行文件,并打入到容器中
Docker镜像名称不能出现大写字母,所以我们需要设置一下镜像的名称
<properties>
<java.version>17</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring-boot-build-image.imageName>springboot3-demo</spring-boot-build-image.imageName>
</properties>
然后执行命令生成Docker镜像。
# 生成docker镜像
mvn -Pnative spring-boot:build-image
# 运行docker镜像,秒启
docker run --rm -p 8080:8080 springboot3-demo:0.0.1-SNAPSHOT
注意: jdk的环境切换默认的jdk17
对jar包进行本地化构建
Spring Boot 应用程序通常通过 Maven ( mvn spring-boot:build-image
) 或 Gradle ( gradle bootBuildImage
) 集成使用 Cloud Native Buildpacks。但是,您也可以使用pack将经过 AOT 处理的 Spring Boot 可执行 jar 转换为本机容器映像。
首先,确保 Docker 守护程序可用(有关详细信息, 请参阅获取 Docker )。如果您使用的是 Linux,请将其配置为允许非根用户。
您还需要pack
按照buildpacks.io 上的安装指南进行安装。
myproject-0.0.1-SNAPSHOT.jar
假设一个 AOT 处理过的 Spring Boot 可执行 jar在目录中构建target
,运行:
pack build --builder paketobuildpacks/builder:tiny \
--path target/myproject-0.0.1-SNAPSHOT.jar \
--env 'BP_NATIVE_IMAGE=true' \
my-application:0.0.1-SNAPSHOT