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

相關文章
相關標籤/搜索