jar包获取资源文件

背景

写的一个spring boot项目打成jar包部署运行下,打成jar包,提示找不到资源文件,以下图:spring

 直接经过idea是能够运行的,但打成jar包后提示找不到资源文件,简单查阅后了解到是由于jar包在读取文件的方式不一致致使的ide

 

问题分析

先定位到哪行代码出错,以下:this

URI configurationFileURI = this.getClass().getClassLoader().getResource(CONFIGURATION_FILE).toURI();
这里报错,提示getResource为null。

缘由以下:idea

在jar文件中查找资源和在文件系统中查找资源的方式是不同的spa

错误的加载方式:code

XXX.calss.getResource(path)
XXX.calss.getClassLoader().getResource(path)

正确的加载方式:blog

XXX.class.getResourceAsStream(path)
XXX.calss.getClassLoader().getResourceAsStream(path)

以流的方式来加载资源

 

解决方法

知道了根本缘由了,就简单了,将以前getResource这种方式改为getResourceAsStream方法部署

具体代码以下:get

InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream(CONFIGURATION_FILE);
BufferedReader br = new BufferedReader(new InputStreamReader(resourceAsStream));
​
String s = "";
List<String> lines = new ArrayList<String>();
​
while ((s = br.readLine()) != null) {
    lines.add(s);
}
​
// 关闭流
resourceAsStream.close();
br.close();

 

简单总结

  1. 在jar文件中查找资源和在文件系统中查找资源的方式是不同的

  2. jar包是一个单独的文件而非文件夹,绝对不可能经过"file:/e:/.../ResourceJar.jar/resource/res.txt"这种形式的文件URL来定位资源文件

  3. public InputStream getResourceAsStream(String name); 返回读取指定资源的输入流。这个方法很重要,能够直接得到jar包中文件的内容。

 

参考资料

http://hxraid.iteye.com/blog/483115

相关文章
相关标签/搜索