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

本地自测的时候,用该方式下载模版文件是没有问题的,欢欢喜喜的打包部署liunx服务器,结果突然报错,无法正常下载模版文件了。

空下来,找到了这篇文章和解释原因,最终是用下面方式解决的:

java 复制代码
ClassPathResource classPathResource = new ClassPathResource("downloadTemplate/xxxx.xlsx");
InputStream inputStream = classPathResource.getInputStream();

以下是解释原因。

项目写完了,自己也简单的测试了一下没问题,但打成Jar包之后就出现问题了,没有办法加载配置文件,具体的问题是这样的:

在代码中用Spring的ResourceUtils.getFile()得到某一配置文件,代码具体如下

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

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

java 复制代码
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项目中直接读取文件时候,在本地项目没有问题等部署到项目中会出现读取不带文件的问题

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

java 复制代码
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()

具体代码如下

java 复制代码
ClassPathResource classPathResource = new ClassPathResource("configfile/config.txt");
InputStream inputStream = classPathResource.getInputStream();
相关推荐
咩咩啃树皮8 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
鱟鲥鳚9 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
大模型码小白10 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司11 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
爱笑的源码基地12 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
wuqingshun31415912 小时前
TCP超时重传机制是为了解决什么问题?
java
莫逸风14 小时前
【AgentScope 2.0】 0. 学习指南
java·llm·agent·agentscope
z1234567898615 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
yaoxin52112315 小时前
470. Java 反射 - Member 接口与 AccessFlag
java·开发语言·python
做个文艺程序员16 小时前
Linux第24篇:Java应用监控体系搭建:Prometheus+Grafana可视化运维
java·grafana·prometheus