无法从jar加载资源文件

时间:2014-08-18 12:07:55

标签: java jar resources

我正在使用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,函数!Files.exists()返回false。

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:8)

当您使用资源加载器时,您应该打开文件的InputStream,而不是通过它的路径引用文件。

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

尝试使用this.getClass().getResourceAsStream("config.json");如果返回的流为null,则资源不存在。

这种方式即使将资源打包到jar中,类加载器也会始终返回正确的内容。

答案 1 :(得分:4)

您无法使用File类访问jar中的路径,因为它不是本机文件系统资源,从jar读取需要的不仅仅是阅读普通文件(拆包等)。

因此,要从jar加载文件,最好的方法是使用类加载器:它知道如何搜索jar文件,如何解压缩等等。

所以要阅读文件,最好使用

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

configStreamnull时,您知道该类文件中不存在该文件。

现在唯一缺少的是String - 路径的表示,但我无法想到你实际需要它的用例 - 如果你真的,真的需要它你可以用你原来的方式来获得它。

PS:我也无法想到你在获得路径时必须检查文件是否存在的原因 - 如果文件不存在this.getClass().getResources("config.json").getPath();则应该失败NullPointerException !!

答案 2 :(得分:-1)

我想如果你使用mvn构建jar

你可以构建具有所有依赖关系的jar。这将打包所需的依赖jar和文件。你可以阅读 http://maven.apache.org/plugins/maven-assembly-plugin/descriptor-refs.html

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