记一次SpringNative的尝鲜以及踩坑记录

  • Post author:
  • Post category:其他


前段时间,Spring官方推出了SpringNative项目,它需要依赖GraalVM的Native-Image功能,详细的内容请参考官方网站:

https://spring.io/blog/2021/03/11/announcing-spring-native-beta

那么接下来就说说我的项目运行过程

首先是创建项目,这部分很简单,应该不需要多做说明,在IDEA中新建Spring项目,在选择依赖的时候勾选SpringNative即可
勾选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解决,安装时勾选这些即可
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访问接口,也是可以正常访问的

Postman访问接口

多出的几个dll文件目前用途不明,exe文件换到别的路径下不依赖dll也是可以正常运行的,只不过不清楚是否是我操作的问题,又或者是SpringNative的bug,项目的启动的速度并没有达到官网所说的小于100毫秒,不过速度相比从jar包运行确实有少量提升



版权声明:本文为qq_37431622原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。