今天项目测试时,遇到一个问题,因为第一次遇到,所以记录一下:
1、问题情况如下:
存放在项目resources目录下的静态资源文件,需要在接口调用时,将其copy到其他文件位置,但是打包后运行,调用时报错FileNotFoundException。
开发中代码调试没有问题,但是打成jar包之后,在测试服务器运行时就报错,报错情况如下:
java.io.FileNotFoundException: class path resource [db/aixing.db] cannot be resolved to absolute file path because it does not reside in the file system:jar:file:/C:/Users/office/Desktop/card_active-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/db/aixing.db
2、看到日志后,第一反应是资源文件不存在,打包时没打进去丢失了,但取jar包看了之后发现有文件。
3、想了一下之后,发现报错的文件路径不太对
为什么多了两个感叹号,个人猜测是打包机制的问题,会造成路径不匹配?(希望了解的朋友指教一二)
4、上网查询之后,找到解决办法。
这是我获取文件路径方式,这样似乎不对,开发阶段调试没问题,打成jar包运行有错。
InputStream inputStream = CardActiveApplication.class.getClassLoader().getResourceAsStream("db/aixing.db");
上面是网友提供的获取文件路径方式,尝试之后发现可以
5、结果总结
开发中,编译器会自动将代码和静态资源动态编译到target目录下,在使用时可以通过getfile()读到所需的文件的,但打包后,由于某种原因,getfile()失效了。此时先使用getClassLoader()获取编译后类的相对路径等信息,再使用getResourceAsStream()可以动态获取资源的文件流。