前段时间,Spring官方推出了SpringNative项目,它需要依赖GraalVM的Native-Image功能,详细的内容请参考官方网站:
https://spring.io/blog/2021/03/11/announcing-spring-native-beta
那么接下来就说说我的项目运行过程
首先是创建项目,这部分很简单,应该不需要多做说明,在IDEA中新建Spring项目,在选择依赖的时候勾选SpringNative即可
但是值得一题的是,SpringNative和SpringBootDevTools是不兼容的,如果勾选这个依赖,那么项目打包的时候就会报错,如图:
处理方法倒也简单,只要把SpringBoot DevTools的依赖从pom.xml中删除即可。
然后接下来简单写个Controller
@RestController
public class TestController {
@RequestMapping("/test/{id}")
public String test(@PathVariable Integer id){
return id + "";
}
}
直接打包程序,结果如图
尽管此时GraalVM已经安装,环境变量也已经配置,但是JDK1.7以后安装包会在windows\System32中生成快捷方式,并且PATH环境变量中还有个C:\Program Files\Common Files\Oracle\Java\javapath
这个路径也必须删除,再将JAVA_HOME改为GraalVM的根目录即可
这里说下,我在测试时配置完变量后重启IDEA后并没有生效,最终是重启系统后才生效的
那么,环境已经搭建完了,我们可以打包运行项目了,才怪,你以为这就结束了?仅仅只是这样是不够的,项目打包过程中还需要依赖MSVC环境,缺少环境则会报错:Default native-compiler executable ‘cl. exe’ not found via environment variable PATH
这个可以通过Virtual Studio安装MSVC解决,安装时勾选这些即可
吐槽一句,VS的占用是真的离谱,即使只勾选这几个组件,也需要占用7.8G的空间,而且还是C盘。
安装完成后,需要将
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.16.27023\bin\HostX64\x64
填入环境变量。
本以为这样就算完事了,结果并没有,编译时仍然会报错,Error compiling query code (in C:\Users\xxx\AppData\Local\Temp\SVM-8246985……
看样子还少了一些环境变量,后来在其他人的博客中发现了解决方案
https://blog.csdn.net/q412086027/article/details/113878426
原来还缺少了LIB和INCLUDE变量
LIB=C:\Program Files (x86)\Windows Kits\10\Lib\10.0.17763.0\um\x64;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.17763.0\ucrt\x64;C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.16.27023\lib\x64;
INCLUDE=C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\ucrt;C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um;C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\shared;C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.16.27023\include
将以上环境以及依赖全部配置完毕后,项目终于可以正常打包了
不得不说这个编译速度是真的慢,像这样一个demo编译起来都花费了5分钟多,如果项目足够大的话,编译的过程估计会令人抓狂。
可以看到,target目录下除了常规的jar包以外,还有几个dll和exe,而这个demo.exe就是SpringNative打包后的程序,双击便可以直接运行
再通过PostMan访问接口,也是可以正常访问的
多出的几个dll文件目前用途不明,exe文件换到别的路径下不依赖dll也是可以正常运行的,只不过不清楚是否是我操作的问题,又或者是SpringNative的bug,项目的启动的速度并没有达到官网所说的小于100毫秒,不过速度相比从jar包运行确实有少量提升