解决SpringBoot项目jar启动异常:java.io.FileNotFoundException: file:/xxx/xxx.jar!/BOOT-INF/classes!/xxx.yml

问题

最近公司项目要对接一个平台服务,项目是新建的,使用的是SpringBoot2.x,但对接平台给的整合包比较旧,2015开发的,整合进来发现存在一个问题:启动时找不到配置resources目录下的配置文件

异常内容如下:

java.io.FileNotFoundException: file:/xxx/project-xxx.jar!/BOOT-INF/classes!/xxx.yaml (No such file or directory)

很奇怪,检查了打包出来的jar,配置文件明明是存在的,为什么找不到呢?

于是,debug了一下出现问题的地方。

发现在平台给的整合包中,代码中读取配置文件的代码为:new FileInputStream(url.getPath())

这个问题就很好定位了,原因在于这种获取配置文件的方式无法获取压缩包中的配置文件。

解决方法

问题定位了,其实挺好解决,联系对方平台,将整合包中获取配置文件的代码修改一下,不要使用getResource或getFile方法来访问,而是使用获取文件流的方式,使用resource.getInputStream() 或getResourceAsStream()方法。

InputStream is=this.getClass().getResourceAsStream("xxx/xxx.yaml"); 
BufferedReader br=new BufferedReader(new InputStreamReader(is)); 

或者

Resource resource = new ClassPathResource("xxx/xxx.yaml");
InputStream inputStream = resource.getInputStream();

但是!对方怎么可能会改呢。。。

别问,问就是自己解决。但是我又不想改成war形式打包再放入web容器中启动的方式,于是我就查看了官方文档,看看有没有能解决这种问题的。

别说,还真有!在部署应用的章节中描述了这种运行解压缩存档,再启动相应的启动器的部署方式。

解决SpringBoot项目jar启动异常:java.io.FileNotFoundException: file:/xxx/xxx.jar!/BOOT-INF/classes!/xxx.yml_第1张图片
使用这种方式再测试了下代码,没有这个问题了。

至此,问题解决。

你可能感兴趣的:(Java)