寫的一個spring boot項目打成jar包部署運行下,打成jar包,提示找不到資源文件,如下圖:

直接通過idea是可以運行的,但打成jar包后提示找不到資源文件,簡單查閱后了解到是因為jar包在讀取文件的方式不一致導致的
問題分析
先定位到哪行代碼出錯,如下:
URI configurationFileURI = this.getClass().getClassLoader().getResource(CONFIGURATION_FILE).toURI();
這里報錯,提示getResource為null。
原因如下:
在jar文件中查找資源和在文件系統中查找資源的方式是不一樣的
錯誤的加載方式:
XXX.calss.getResource(path)
XXX.calss.getClassLoader().getResource(path)
正確的加載方式:
XXX.class.getResourceAsStream(path)
XXX.calss.getClassLoader().getResourceAsStream(path)
以流的方式來加載
解決方法
知道了根本原因了,就簡單了,將之前getResource這種方式改成getResourceAsStream方法
具體代碼如下:
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包中文件的內容。
http://hxraid.iteye.com/blog/483115
