【发布时间】: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