1. 程式人生 > >jar包獲取資原始檔

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