其他分享
首页 > 其他分享> > 日常踩坑_jar包读取不到资源文件

日常踩坑_jar包读取不到资源文件

作者:互联网

背景提要

之前不是为了导出word使用了一个WordUtil工具类嘛,这个工具类中需要一个资源文件css,然后就将该资源文件放在了WordUtil同包下的resources文件夹下
然后使用BufferedInputStream bufferedInputStream = (BufferedInputStream) Resources.getResource("css/quill.core.css").getContent();来获取到css文件
这一切到这里还相当美好,因为本地导出正常,富文本也在生效
但是! 但是当被打成jar包发布到线上后,一切都不一样了/(ㄒoㄒ)/~~
word无法导出,原因是找不到css文件

先说结论

即便是资源信息也被打包到了jar包里,根据Resources.getResource也无法查找到资源文件
正确方式是让类加载器去找,然后我就把上面那句代码改换为了下面这句:
BufferedInputStream bufferedInputStream =(BufferedInputStream) this.getClass().getClassLoader().getResourceAsStream("css/quill.core.css")
本地依旧是风和日丽,你好我好的一片完美景象
但是!但是jar包运行的时候,又又又又报错了,还好这次的报错信息just只是类型转换的错误
ZipInflaterInputStream cannot be cast to java.io.BufferedInputStream,报了一个这个的错,好嘛,不能强转
看了一下ZipInflaterInputStream 和 BufferedInputStream都是InputStream的子类,那就取消强转
来了,最终版本:
InputStream bufferedInputStream = this.getClass().getClassLoader().getResourceAsStream("css/quill.core.css");

原因:

getResource() 方法的获取范围仅限于 指定的范围classpath,classpath 之外的资源是无法获取到的。
而 jar 是被我们包含在 classpath 中的
所以这类资源一般是存在于 classpath 中的文件
我们可以使用上面的 getResource()方法获取到其路径,(通常样式是资源所在文件的路径+资源在文件中的路径)但是没有办法直接通过文件读取到。
但是可以通过 classLoader 对象中的 getResourceAsStream()方法获取到资源的输入流。
通过 getResourceAsStream() 方法获取资源的输入流实际上是通过 URL 对象,通过 openStream()方法打开的,因此我们只需要拿到正确的资源URL 地址,就能够获得该类资源的输入流了。

跳坑结束,祝你快乐!

标签:文件,读取,BufferedInputStream,getResource,jar,css,资源,日常
来源: https://www.cnblogs.com/deanCopy/p/16398037.html