ResouceUtils.getFile()取不到Jar中資源文件源碼


項目寫完了,自己也簡單的測試了一下沒問題,但打成Jar包之后就出現問題了,沒有辦法加載配置文件,具體的問題是這樣的:
在代碼中用Spring的ResourceUtils.getFile()得到某一配置文件,代碼具體如下

File abcXml= org.springframework.util.ResourceUtils.getFile("classpath:abc.xml");

在intellij中間運行的時候沒有問題,但是打成jar包之后出現了如下錯誤

Caused by: java.io.FileNotFoundException: class path resource [abc.xml] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/D:/Users/Sean/IntellijProject/abc/target/abc.jar!/BOOT-INF/classes!/abc.xml

解決辦法:

ResouceUtils.getFile()是專門用來加載非壓縮和Jar包文件類型的資源,所以它根本不會去嘗試加載Jar中的文件,要想加載Jar中的文件,可以用流的形式讀取讀取,

方案一:比如 xx.class.getClassLoader().getResouceAsStream() 

在web項目中直接讀取文件時候,在本地項目沒有問題等部署到項目中會出現讀取不帶文件的問題

可以使用一下代碼讀取到文件流

InputStream stream = getClass()
        .getClassLoader()
        .getResourceAsStream("excel_config/batch_import_material_template.xls");
BufferedReader br = new BufferedReader(new InputStreamReader(stream, "UTF-8"));

具體解釋如下:

我們本地讀取文件的時候是使用spring自帶的ResourceUtil.getFile("classpath:xxxx.txt"),該方法讀取是本地的絕對路徑,在我們ide開發工具中是沒有問題的,因為文件就在磁盤商存儲,讀取當然也是通過文件存儲的磁盤地址讀取,但是我們的項目一旦 打包 成jar文件后,我們的所有文件都會在JVM中運行(都是加載到JVM中的),所以使用ResourceUtil.getFile("classpath:xxxx.txt")方法是不可以讀取到的,在JVM中是沒有絕對路徑的,所有的路徑都是依托於讀取文件的當前類對應的classload來加載的,所以我們需要先獲取到當前類的classload,然后通過classload的路徑找文件相對於classload的相對路徑,這時候,我們就需要使用上面的方法來讀取。

https://www.cnblogs.com/chyu/p/8407541.html

方案二:或者InputStream inputStream = new ClassPathResource(fileName).getInputStream() 

具體代碼如下

ClassPathResource classPathResource = new ClassPathResource("configfile/config.txt");
InputStream inputStream = classPathResource.getInputStream();

 

將讀取的文件轉成流,再對流進行操作


免責聲明!

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



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