getResource("path") 在 Intellij 中有效,但在 jar 文件中无效

getResource("path") works in Intellij but not in jar file

我有一个需要阅读的文本文件,我在其中使用了在 Intellij 中有效但在打包的 jar 文件中无效的 LoC。我不想不使用 InputStreamReader,因为我已经创建了一个自己的 Reader class。我从 "src/controllers/MenuController" 中的文件读取,WorldState1.txt 在 "src/files/worldstate1.txt".

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

我是否遗漏了什么或者我误解了 getResource()?

首先,自 java 9(或可能自较新版本以来)

,不建议再使用 getClassLoader()

如果您从 MenuController 提供的代码行 class? 如果是这样,MenuController.class.getResourcethis.getClass().getResources 将您指向其目录:src/controllers/ 并向此路径添加 files/WorldState1.txt。您需要使用 .. 或使用另一个 "startingpoint" 来构建相对路径,例如 SomeClassInSRCFolder.class.getResource("files/WorldState1.txt)

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

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

我还必须使用

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

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

我遇到了同样的问题...文件在我的 jar 文件中,路径符合预期。项目 运行 在 IDE (Intellij) 中运行良好,但 Jar 无法加载我的一些资产。

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

所以,我有 "data/zones/dynamic/myart.png",当 IDE 中的 运行 工作时,JAR 将无法工作,直到我将其更改为 "data/Zones/Dynamic/myart.png".. . 只是那两个大写错误使得资源无法找到...在 Linux 上开发的人没有这个问题,因为整个系统是区分大小写的,他们习惯于小心这些事情.

因此,如果您的代码在 运行 从 JAR 中找不到您的资产,但文件在那里,请仔细检查 path/filename 是否正确。

记住:检查 jar 的内容很容易,只需将其重命名为 .zip 和 open/extract。

祝你好运!