0

我无法在 Windows 上访问我的 Jar 中的文件。当我在 Unix 上运行它时,我没有这个问题。我在 Windows 和 Unix 上都创建了 jar,它没有任何区别。无论哪种方式,它都不能在 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"

一切都无济于事。

我已经尽可能地使用了以下 Stack Overflow 帖子,但它们似乎对我没有答案: 如何正确引用资源文件以进行 JAR 和调试?访问 JAR 文件中的资源从 JAR 中读取文件在 Windows 上不起作用

我将非常感谢任何额外的帮助。提前致谢。

4

1 回答 1

3

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

Class#getResource(String)各州_

在委托之前,使用以下算法从给定的资源名称构造一个绝对资源名称:

如果名称以“/”开头(“\u002f”),则资源的绝对名称是名称中“/”后面的部分。否则,绝对名称的格式如下:modified_pa​​ckage_name/name

其中 modified_pa​​ckage_name 是此对象的包名称,其中 '/' 替换为 '.' ('\u002e')。

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

资源的名称是标识资源的 / 分隔的路径名。

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

InputStream in = MetricCollector.class.getResourceAsStream("/myYAML.yml");
于 2013-09-02T12:37:09.503 回答