簡體   English   中英

無法從jar加載資源文件

[英]Can't load resources file from jar

我正在使用存儲在src/test/resources/config.json配置JSON文件。

我這樣得到它:

String configFile = this.getClass().getResources("config.json").getPath();

我有getPath()方法,因為我需要它的String值,然后檢查文件是否存在並最終解析它。

在Eclipse IDE中一切正常,因為我解析文件/bin/config/config.json ,但是當我創建JAR文件時,路徑是program.jar!/config/config.json和function !Files.exists()返回false 。

我該如何解決這個問題?

當您使用資源加載器時,您應該打開文件的InputStream,而不是通過它的路徑引用文件。

而不是.getResources("config.json").getPath();

嘗試使用this.getClass().getResourceAsStream("config.json"); 如果返回的流為null,則該資源不存在。

這樣即使資源被打包到jar中,類加載器也總是會返回正確的東西。

您無法使用File -class訪問jar中的路徑,因為它不是本機文件系統資源,從jar讀取需要的不僅僅是讀取普通文件(解包等)。

因此,要從jar加載文件,最好的方法是使用類加載器:它知道如何搜索jar文件,如何解壓縮等等。

所以要閱讀文件,你最好使用

InputStream configStream = this.getClass().getResourceAsStream("config.json");

configStreamnull時,您將知道類路徑中不存在該文件。

現在唯一缺少的是路徑的String -representation,但我想不出你真正需要它的用例 - 如果你真的真的需要它,你可以用你原來的方式來獲得它。

PS:我也想不出你得到路徑時必須檢查文件是否存在的原因 - 如果文件不存在this.getClass().getResources("config.json").getPath(); 應該用NullPointerException失敗!!

我想如果你使用mvn來構建jar

你可以構建具有所有依賴關系的jar。 這將打包所需的依賴jar和文件。 你可以閱讀http://maven.apache.org/plugins/maven-assembly-plugin/descriptor-refs.html

在gradle中https://github.com/musketyr/gradle-fatjar-plugin

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM