Springboot jar包读取resources目录下的配置文件
- 使用环境:
kubernetes集群、docker容器、springboot项目
- 问题由来:最近在跟AI训练平台对接docker接口,通过调用SpringBoot项目提供的docker接口实现对docker的所有日常操作。在做到docker import接口时,由于AI训练平台的镜像文件比较大,不能直接获取到镜像文件的文件流,所以考虑到了大文件分段传输技术,将AI训练平台的文件通过分段传输过来,然后本地将分段文件保存,传输完毕后再将分段文件整合,实现镜像文件的传输,然后再使用shell脚本进行镜像文件的加载。我将shell脚本放到了resource/shell/目录下,在本地调试的时候是可以获取到shell脚本的,但当我将项目通过CI构建完成发布到kubernetes集群后,报错:
- 问题分析与解决:
-
使用jar vtf 【fileName.jar】查看jar包内的文件,发现文件是存在的,路径也是正确的,但不知为何k8s-gpu-api-1.0.0.jar和classes后会有感叹号(路径非法)
-
谷歌、百度搜索了相关信息,找到了问题的原因,但按照网上说的文件流、还是ApplicationHome都没有解决问题。
在本地进行调试时,文件是真实存在于磁盘的某个目录。此时通过获取文件路径,是可以正常读取的,因为文件确实存在。而打包成jar以后,实际上文件是存在于jar这个文件里面的资源文件,在磁盘是没有真实路径的。所以通过ResourceUtils.getFile或者this.getClass().getResource("")方法无法正确获取文件。 [^1]
-
将shell脚本通过DockerFile的COPY命令移动到容器的某个目录,然后服务的指定容器上shell脚本所在的shell文件。方法成功,顺利解决spingboot 打成jar包后找不到文件的问题
- 参考文章
[^1] https://www.cnblogs.com/kaile/p/10193979.html