getResource(“path”)在Intellij中工作,但不在jar文件

时间:2018-05-08 13:33:31

标签: java jar classloader

我有一个我需要阅读的文本文件,我在这里使用这个在Intellij中工作但不在打包的jar文件中的LoC。我不喜欢使用InputStreamReader,因为我已经创建了自己的Reader类。我从“src / controllers / MenuController”中的文件中读取,WorldState1.txt在“src / files / worldstate1.txt”中。

GameReader.readFile(this.getClass().getClassLoader().getResource("files/WorldState1.txt").getPath());

我有什么遗漏或者我误解了getResource()吗?

3 个答案:

答案 0 :(得分:0)

首先,不再推荐使用getClassLoader(),因为java 9(或者可能是更新的版本)

如果您从MenuController类提供的代码行? 如果是,MenuController.class.getResourcethis.getClass().getResources将您指向其目录:src/controllers/,则在此路径中添加files/WorldState1.txt。您需要使用..构建相对路径或使用其他“起点”,例如SomeClassInSRCFolder.class.getResource("files/WorldState1.txt)

答案 1 :(得分:0)

基本上问题是我没有使用正确的路径。我最终做的是

 GameReader.readFile(this.getClass().getResourceAsStream("WorldState1.txt"));

我还必须使用

读取文件
new BufferedReader(new InputStreamReader(resource, StandardCharsets.UTF_8)).lines().collect(Collectors.toList());

而不是Files.readAllLines();因为它现在是一个流。希望这有助于其他任何人处理同样的问题。

答案 2 :(得分:0)

我遇到了同样的问题...文件位于我的jar文件中,按预期路径进行。该项目在IDE(Intellij)内​​运行良好,但是Jar无法加载我的某些资产。

问题是,我的开发工作站是Windows计算机,它对目录和文件名不区分大小写,但是Java用于读取JAR中文件的文件访问机制是区分大小写的。

因此,从IDE运行时,在“ data / zones / dynamic / myart.png”可以正常工作的地方,JAR无法工作,直到我将其更改为“ data / Zones / Dynamic / myart.png”。 ...只是这两个大写错误使资源无法找到...在Linux上进行开发的人们没有这个问题,因为整个系统区分大小写,所以他们习惯于谨慎处理这些事情。 / p>

因此,如果从JAR运行时您的代码找不到资产,但是文件在那里,请仔细检查路径/文件名是否大小写。

记住:检查一个罐子的内容很容易,只需将其重命名为.zip并打开/提取。

祝你好运!