寫的一個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();
在jar文件中查找資源和在文件系統中查找資源的方式是不同的
jar包是一個單獨的文件而非文件夾,絕對不可能經過"file:/e:/.../ResourceJar.jar/resource/res.txt"這種形式的文件URL來定位資源文件
public InputStream getResourceAsStream(String name); 返回讀取指定資源的輸入流。這個方法很重要,能夠直接得到jar包中文件的內容。