前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ResouceUtils.getFile()取不到Jar中资源文件源码

ResouceUtils.getFile()取不到Jar中资源文件源码

作者头像
阮键
发布2021-09-28 10:07:17
1.4K0
发布2021-09-28 10:07:17
举报

项目写完了,自己也简单的测试了一下没问题,但打成Jar包之后就出现问题了,没有办法加载配置文件,具体的问题是这样的: 在代码中用Spring的ResourceUtils.getFile()得到某一配置文件,代码具体如下

代码语言:javascript
复制
File abcXml= org.springframework.util.ResourceUtils.getFile("classpath:abc.xml");

在intellij中间运行的时候没有问题,但是打成jar包之后出现了如下错误

代码语言:javascript
复制
Caused by: java.io.FileNotFoundException: class path resource [abc.xml] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/D:/Users/Sean/IntellijProject/abc/target/abc.jar!/BOOT-INF/classes!/abc.xml

解决办法:

ResouceUtils.getFile()是专门用来加载非压缩和Jar包文件类型的资源,所以它根本不会去尝试加载Jar中的文件,要想加载Jar中的文件,可以用流的形式读取读取,

方案一:比如 xx.class.getClassLoader().getResouceAsStream()

在web项目中直接读取文件时候,在本地项目没有问题等部署到项目中会出现读取不带文件的问题

可以使用一下代码读取到文件流

代码语言:javascript
复制
InputStream stream = getClass()
        .getClassLoader()
        .getResourceAsStream("excel_config/batch_import_material_template.xls");
BufferedReader br = new BufferedReader(new InputStreamReader(stream, "UTF-8"));

具体解释如下:

我们本地读取文件的时候是使用spring自带的ResourceUtil.getFile("classpath:xxxx.txt"),该方法读取是本地的绝对路径,在我们ide开发工具中是没有问题的,因为文件就在磁盘商存储,读取当然也是通过文件存储的磁盘地址读取,但是我们的项目一旦 打包 成jar文件后,我们的所有文件都会在JVM中运行(都是加载到JVM中的),所以使用ResourceUtil.getFile("classpath:xxxx.txt")方法是不可以读取到的,在JVM中是没有绝对路径的,所有的路径都是依托于读取文件的当前类对应的classload来加载的,所以我们需要先获取到当前类的classload,然后通过classload的路径找文件相对于classload的相对路径,这时候,我们就需要使用上面的方法来读取。

https://www.cnblogs.com/chyu/p/8407541.html

方案二:或者InputStream inputStream = new ClassPathResource(fileName).getInputStream()

具体代码如下

代码语言:javascript
复制
ClassPathResource classPathResource = new ClassPathResource("configfile/config.txt");
InputStream inputStream = classPathResource.getInputStream();

将读取的文件转成流,再对流进行操作

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-09-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档