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

摘要:
/BOOT-INF/classes!

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

File abcXml= org.springframework.util.ResourceUtils.getFile("classpath:abc.xml");

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

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

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

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()

具体代码如下

ClassPathResource classPathResource = new ClassPathResource("configfile/config.txt");
InputStream inputStream = classPathResource.getInputStream();

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

免责声明:文章转载自《ResouceUtils.getFile()取不到Jar中资源文件源码》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Mysql字符集设置支付宝的同步和异步的区别下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

netbeans工具使用xdebug断点调试php源码

对有有经验的程序员,使用echo、print_r()、print_f()、var_dump()等函数足以调试php代码,如果需要在IDE工具中使用断点调试,xdebug就是一个非常好的php调试工具。对于不熟悉的代码,可以用Xdebug一步一步的查看请求过程和代码执行过程。 准备工作本地部署的server环境,推荐用phpStudy(内置xdebug),开...

编译安装openresty

选择版本 Openresty的版本号比较简单,形式为:Openresty 1.2.3.x 例如Openresty 1.17.8.2表示是基于Nginx 1.17.8开发的第二个版本 那么选择的标准就是根据自己的需要,对应nginx的版本来下载 预编译包安装(可跳过) 这里以centos为例,简单带过一下,根据官方的要求,Red Hat类的系统支持的Open...

VS环境下用thrift-C/C++接口开发hbase应用

一、前言 用C/C++开发hbase应用,需要用到thrift接口。在windows平台使用Visual Studio时,要比在linux平台复杂一些,主要是因为一些依赖库无法做到自动安装(类似yum install或 apt-get install那样),其次是因为Linux本来就是hbase及其依赖库的原生平台。但总体而言,两个平台的过程大体相似。 开...

12.tomcat7切换tomcat8导致cookie异常

一、现象 换成Tomcat8后出现cookie报错 二、分析 经异常去查看源码发现,Tomcat8对cookie校验规则改变,更为严格的校验了cookieHeader不允许有, 日志中的[XXXXX,XXXX]被当做异常处理。 三、解决方案 1.该异常不影响系统运行,可以注意打印cookie的格式 2.编写现有类,代替原有cookie处理类(此方法经常用来...

Android 7.0 Gallery图库源码分析1

分析一个项目的源代码时,第一件事就是查看清单文件,找到程序入口,我们从Gallery2源码的清单文件中可以看到GalleryActivity是此应用的启动Activity。 1 <activity android:name="com.android.gallery3d.app.GalleryActivity" android:label="@stri...

Object非空判断

类Objects,它由一些静态的实用方法组成,这些方法是null-save(空指针安全的)或null-tolerant(容忍空指针的),那么在它的源码中,对对象为null的值进行了抛出异常操作。 public static T requireNonNull(T obj) :查看指定引用对象不是null。 查看源码发现这里对为null的进行了抛出异常操作:...