jar包獲取資原始檔
阿新 • • 發佈:2018-11-30
寫的一個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