【问题标题】:getResource("path") works in Intellij but not in jar filegetResource("path") 在 Intellij 中有效,但在 jar 文件中无效
【发布时间】:2018-10-18 11:33:43
【问题描述】:

我有一个需要阅读的文本文件,我在其中使用了这个在 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()?

【问题讨论】:

  • 那么files/WorldState1.txt 在你的 JAR 文件的类路径中吗?输入jar -tvf your_jar.jar 看看是否存在。
  • 另外,请告诉我们您的项目,以及您是否使用了 Maven 或 Gradle 等框架。
  • jar -tvf 给我一个 java.nio.file.NoSuchFileException: Semesteroppgave.jar 我没有使用任何框架,内置于 JavaFX
  • 只需在与Semesteroppgave.jar 相同的位置运行即可。它运行了吗?
  • 它说的是 files/WorldState1.txt,所以我猜它在那里?

标签: java jar classloader


【解决方案1】:

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

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

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

所以,如果您的代码在从 JAR 运行时找不到您的资产,但文件在那里,请仔细检查路径/文件名是否正确。

记住:检查 jar 的内容很容易,只需将其重命名为 .zip 并打开/解压即可。

祝你好运!

【讨论】:

    【解决方案2】:

    首先,自 java 9(或可能自较新版本)起不再建议使用 getClassLoader()

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

    【讨论】:

    • getResource 不是总是相对于类路径的开头吗? OP 说它在哪里使用 Java 9?
    • 我正在使用 Java 10 顺便说一句,不知道它已被弃用
    • 它没有被弃用,它改变了模块化,可能会导致问题。
    • 所以如果我在文件/GameReader 中,那么获取 WorldState 路径的正确方法是 this.getClass().getResource(".WorldState1.txt") 因为 WorldState 也在文件中.这似乎不起作用
    • 文件名是“WorldState1.txt”而不是“.WorldState1.txt”
    【解决方案3】:

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

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

    我还必须使用读取文件

    new BufferedReader(new InputStreamReader(resource, StandardCharsets.UTF_8)).lines().collect(Collectors.toList());
    

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

    【讨论】:

      猜你喜欢
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-30
      • 2019-09-19
      • 2021-12-23
      • 2013-01-31
      相关资源
      最近更新 更多