写的一个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();
在jar文件中查找资源和在文件系统中查找资源的方式是不同的
jar包是一个单独的文件而非文件夹,绝对不可能经过"file:/e:/.../ResourceJar.jar/resource/res.txt"这种形式的文件URL来定位资源文件
public InputStream getResourceAsStream(String name); 返回读取指定资源的输入流。这个方法很重要,能够直接得到jar包中文件的内容。