我正在使用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。
我该如何解决这个问题?
答案 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");
当configStream
为null
时,您知道该类文件中不存在该文件。
现在唯一缺少的是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