Windows环境使用native-image本地镜像工具编译SpringBoot项目本地镜像
MSVC环境安装
要想在未安装Java以及其他开发环境的Windows平台运行SpringBoot项目,MSVC环境是必要的
下载VisualStudio(不是VSCode)
这里我已经下载完毕,如果已经下载过可以在Windows搜索栏搜索Visual Studio Installer
打开后在下面界面选择修改来选择新工具安装
打开会出现以下界面(没有安装VS自行搜索Visual Studio下载专业或者社区版安装时也会出现此节面)
选择使用C++的桌面开发 通用Windows平台开发这两个组件
切记:要记住你的安装位置(VC安装路径会显示在安装界面下方)
检查本地工具安装情况
上述过程安装完毕后,在Windows搜索栏中搜索Native Tools会出现以下两个命令行工具
这里使用X64 Native Tools Command即64位,X86是32位环境
安装GraalVM
本次安装GraalVM社区版本即可
GraalVM安装
GraalVM下载链接
GraalVM-ce-java17-windows-X64-22.3.2
注意,SpringBoot3必须使用22.3以上版本
下载完成解压到你要安装的目录(随意,路径不要带中文)
随后在系统环境变量中将JAVA_HOME值改为GraalVM安装路径(没有就创建一个JAVA_HOME)
验证安装
如果安装正确,在powershell或者cmd中输入java -version
应当显示
测试gu工具
在cmd或者powershell输入gu --help
应当有帮助提示输出
Windows上由于gu会与Windows命令Get-Unique冲突,所以如果提示找不到可以用**gu.cmd
**代替gu
本地镜像工具安装
接下来安装native-image
工具
native-image 下载:native-image-installable-svm-java17-windows-amd64-22.3.2.jar
之后打开powershell或cmd命令行工具
使用以下命令定位到刚刚下载的jar包所在目录
cd native-imagejar包下载目录
使用gu install --file native-image工具jar包名称
安装(gu用不了用gu.cmd)
验证native-image工具安装
重启命令行输入native-image --help
应当能输出命令帮助信息
添加系统环境变量
打开系统环境变量编辑
修改或添加以下路径
Path:
添加你的VC安装路径\App\VC\Tools\MSVC\14.37.32822\bin\Hostx64\x64
14.37.32822是版本号,每个人可能不一样找到你的具体目录拷贝进去
JAVA_HOME:
修改为GraalVM安装路径,如果你之前没有安装其他Java环境,需要在Path中添加%JAVA_HOME%\bin
INCLUED
创建INCLUDE
系统环境变量
添加:
- 自己的VC安装目录\App\VC\Tools\MSVC\14.37.32822\include;
- C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\shared;
- C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\ucrt;
- C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\um;
- C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\winrt;
去你自己对应目录找,找全后一起拼接着粘贴进去,五个路径之间用
;
分隔开
LIB
创建LIB
系统环境变量
添加:
- 自己的VC安装目录\App\VC\Tools\MSVC\14.37.32822\lib\x64;
- C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22621.0\ucrt\x64;
- C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22621.0\um\x64
和上面一样去自己对应目录找,找全后一起拼接着粘贴进去,五个路径之间用
;
分隔开
准备完毕
至此环境安装全部完毕,如果你需要其他的版本
可在GraalVM的GitHub页面下载:GraalVM-GitHub
之前的GraalVM和native-image均来自于此
创建示例SpringBoot项目
这里使用IDE的Spring脚手架创建
JDK一定要选择GraalVM
SpringBoot版本一定是3以上版本,依赖项选择GraalVM Native Support(必选)
和 你需要的依赖,这里我选择一个Web
项目结构
出了启动类以外简单的写一个controller模拟一个简单功能演示即可
![在这里插入图片描述](https://img-blog.csdnimg.cn/5a65317097c44e208a239450e51d4f6a.png
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello(){
return "Hello GraalVM Native";
}
}
发送hello请求返回一句Hello GraalVM Native
使用native-image打包
使用maven执行clean 和 package打包
在target目录下生成了一个项目的jar包
AOT处理
由于SpringBoot底层用到了大量反射,因此直接进行提前编译时不可行的,因为反射是动态的,程序在执行过程中才会决定执行什么模块,因此对于SpringBoot项目需要做额外处理。
SpringBoot脚手架在创建项目时导入了一个springboot:process-aot模块用于提前对反射模块进行处理
双击执行此模块即可对其进行处理
完成后target目录会生成用于AOT的预处理文件
接下来使用maven模块中项目创建自动导入的native:build进行打包
这里打包会出现问题
这是一个Bug
所以我们使用刚刚使用VC安装的native tools
进行操作
右键使用管理员身份
打开x64 Native Tools Command
接着cd 命令定位到你的项目路径下
由于这是cmd命令行,初始在C盘符,如果你项目在D盘是cd不过去的
先执行D:
切换到D盘再cd就行了
使用mvn -Pnative native:compile
执行编译
此时又会遇到问题
这是因为native插件的盘符路径转换问题
再idea中找到target目录下的tem目录会发现生成的args文件,每次执行编译都会生成一个args文件,任意打开一个
发现是路径出了问题,IDEA中使用Ctrl + R
将所有\\
替换为/
复制修改后文件的文件名
回到x64 Native Tools Command
命令行使用native-image
命令打包
执行native-image @target\tmp\native-image-4652055330304047537.args
native-image-4652055330304047537.args替换为你自己修改过的文件名称
注意@target\tmp\xxx.args是路径,因为之前已经cd到项目路径所以是target\tmp\xxx.args,如果你已经再target目录则是tmp\xxx.args,如果在其他目录你可以用绝对路径
开始打包
显示Finished generating就算成功了
在target目录下会生成一些obj之类的链接文件和一个项目名称.exe
文件
你可以选择在资源管理器中打开
随后在资源管理器地址栏直接输入powershell打开命令行
使用.\exe
文件名称运行(直接双击是打不开的)
可以看到BootAotTestApplication in 0.062 seconds (process running for 0.065)
启动运行速度非常快
测试
在地址栏目输入项目启动的服务地址,我使用默认的https://localhost:8080/hello测试
使用native-image打包的exe文件可在任何Windows平台设备运行,不论是否安装运行环境