我在Windows上的Jar中访问文件时遇到问题。我在Unix上运行时没有这个问题。我在Windows和Windows上创建了这个jar Unix和它没什么区别。无论哪种方式,它都无法在Windows上运行。
我在jar上运行了jar -tf命令,我运行的类位于:a / b / c / d / ClassOne.class。我正在寻找的类位于jar的基本目录中:ClassTwo.class
此ClassOne中的代码如下所示:
String path = File.separator + "myYAML.yml";
InputStream in = MetricCollector.class.getResourceAsStream(path);
InputStreamReader isr = new InputStreamReader(in);
BufferedReader input = new BufferedReader(isr);
我的代码在最后一行显示抛出NullPointerException,我只能相信它意味着找不到我给它的路径。但是,当我运行jar时,这个确切的代码在我的调试器和Unix上运行良好。
我还测试了以下路径:
"myYAML.yml"
File.seperator + ".." + File.seperator + ".." + File.seperator + ".." + File.seperator + ".." + "myYAML.yml"
".." + File.seperator + ".." + File.seperator + ".." + File.seperator + ".." + "myYAML.yml"
一切都无济于事。
我已经使用了以下Stack Overflow帖子来尽我所能,但他们似乎没有给我一个答案:How to reference a resource file correctly for JAR and Debugging?,Accessing resources within a JAR file和Reading file from within JAR not working on windows
任何额外的帮助我都会非常感激。提前谢谢。
答案 0 :(得分:3)
File.separator
无法在Windows上运行,它会返回\
。无论操作系统如何,您都需要使用/
作为分隔符。
在委托之前,从中构造绝对资源名称 使用此算法给定资源名称:
如果名称以'/'('\ u002f')开头,则绝对名称为 资源是'/'后面的名称部分。除此以外, 绝对名称的格式如下:modified_package_name / name
其中modified_package_name是此对象的包名称 用'/'代替'。' ( '\ u002e')。
换句话说,您必须使用/
。 Class#getResource
委托给ClassLoader.html#getResource(java.lang.String)
的javadoc进一步解释了这一点。
资源的名称是用于标识的资源的/ -separated路径名 资源。
如果资源位于类路径的根目录,请使用
InputStream in = MetricCollector.class.getResourceAsStream("/myYAML.yml");