jar包獲取資源文件


背景

寫的一個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();

 

簡單總結

  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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM