【问题标题】:Reading file from within JAR not working on windows从 JAR 中读取文件在 Windows 上不起作用
【发布时间】:2013-04-04 09:11:36
【问题描述】:

我正在尝试从打包在 JAR 中的文件以及读取它的类中读取。为此,我使用以下内容:

getClass().getClassLoader().getResourceAsStream(file)

当我在 OSX 上创建和运行 JAR 文件时,这可以正常工作,但如果我在 Windows 上创建和运行 JAR 文件,上述行返回 null。

我在这里遗漏了什么吗?如果我在 OSX 上创建 JAR 并在 Windows 上运行它,它工作正常。仅当我在 Windows 上创建 JAR 时才会出现此问题。

编辑:值得一提的是,JAR 文件中没有文件夹层次结构。一切都存储在一个级别,因此读取文件的类和文件本身都在同一个目录中。此外,这就是我在 OSX 和 Windows 上创建 JAR 文件的方式:

jar -cmf manifest.mf run.jar *.class file1 file2

编辑 2:我要加载的文件是 java .properties 文件。我认为这不是导致问题的原因?

【问题讨论】:

  • Jar 文件是 zip 文件,因此您可以使用它来验证 Windows 创建的版本。使用 .zip 重命名它,然后使用 Windows Explorer 浏览。
  • @NathanielWaisbrot 验证到底是什么?文件都在那里?我已经检查过了(使用 jar -tf 代替),它们肯定都在我在问题中描述的结构中
  • 你说在Mac上构建的jar可以在Windows上运行,但是在Windows上构建的jar就不行了。比较两个jar文件的内容。如果您使用的是相同版本的 Java,我认为 .class 文件应该是相同的。
  • @NathanielWaisbrot diff 告诉我它们是不同的,但我怎样才能准确地看到哪一行?我刚刚检查过,windows机器和Mac运行的是不同版本的Java。不过,我无法想象这会导致问题?
  • 你不能只区分罐子。由于清单,它们将始终不同。您想要区分内部结构和单个文件。也许只是扩展 zip 文件并使用 ediff。如果您发现.class 有差异,请使用javap 反汇编两个版本并进行比较。我唯一能想象到的问题是版本不匹配或文件编码...

标签: java windows file jar classloader


【解决方案1】:

使用文件分隔符时,不要对它们进行硬编码! 改用 java.io.File.separator:http://docs.oracle.com/javase/7/docs/api/java/io/File.html#separator

【讨论】:

  • File.pathSeparator 在 OS X 上返回分号,它不适合您告诉它的用途。 File.separator 返回斜杠,因此是要使用的。
【解决方案2】:

这样试试getClass().getResourceAsStream("/file1")。

【讨论】:

    【解决方案3】:

    跳过类加载器部分。只需 getClass().getResource....

    【讨论】:

    • 我会Classloader.getSystemResource()
    • 我也试过了。结果相同:适用于 OSX,不适用于 Windows。我也试过this.getClass().getResourceAsStream("\file");,但也没有用
    • 啊哈!不要使用任何路径分隔符。只是文件名。
    猜你喜欢
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多