从Windows中的jar中访问文件

时间:2013-09-02 12:35:42

标签: java windows jar

我在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上运行良好。

我还测试了以下路径:

  1. "myYAML.yml"
  2. File.seperator + ".." + File.seperator + ".." + File.seperator + ".." + File.seperator + ".." + "myYAML.yml"
  3. ".." + File.seperator + ".." + File.seperator + ".." + File.seperator + ".." + "myYAML.yml"
  4. 一切都无济于事。

    我已经使用了以下Stack Overflow帖子来尽我所能,但他们似乎没有给我一个答案:How to reference a resource file correctly for JAR and Debugging?Accessing resources within a JAR fileReading file from within JAR not working on windows

    任何额外的帮助我都会非常感激。提前谢谢。

1 个答案:

答案 0 :(得分:3)

File.separator无法在Windows上运行,它会返回\。无论操作系统如何,您都需要使用/作为分隔符。

Class#getResource(String)

  

在委托之前,从中构造绝对资源名称   使用此算法给定资源名称:

     

如果名称以'/'('\ u002f')开头,则绝对名称为   资源是'/'后面的名称部分。除此以外,   绝对名称的格式如下:modified_pa​​ckage_name / name

     

其中modified_pa​​ckage_name是此对象的包名称   用'/'代替'。' ( '\ u002e')。

换句话说,您必须使用/Class#getResource委托给ClassLoader.html#getResource(java.lang.String)的javadoc进一步解释了这一点。

  

资源的名称是用于标识的资源的/ -separated路径名   资源。

如果资源位于类路径的根目录,请使用

InputStream in = MetricCollector.class.getResourceAsStream("/myYAML.yml");