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

Java getResource(“路径”)在Intellij中工作,但在jar文件中不工作,java,jar,classloader,Java,Jar,Classloader,我有一个需要读取的文本文件,在这里我使用这个LoC,它在Intellij中工作,但不在打包的jar文件中。我不想使用InputStreamReader,因为我已经创建了自己的Reader类。我从“src/controllers/MenuController”中的一个文件中读取,WorldState1.txt位于“src/files/WorldState1.txt”中 我是否遗漏了什么或误解了getResource() 首先,自从java 9(或者可能是新版本)以来,不建议再使用getClassL

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


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

首先,自从java 9(或者可能是新版本)以来,不建议再使用getClassLoader()

如果您提供的代码行来自MenuController类?
如果是
MenuController.class.getResource
this.getClass().getResources
将您指向其目录:
src/controllers/
,并将
文件/WorldState1.txt添加到此路径。您需要使用
或使用另一个“起始点”,如
someClassisrcfolder.class.getResource(“files/WorldState1.txt)
基本上,问题是我没有使用正确的路径。我最终做的是

 GameReader.readFile(this.getClass().getResourceAsStream("WorldState1.txt"));
我还必须使用

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

而不是文件。readAllLines();因为它现在是一个流。希望这有助于其他人处理相同的问题。

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

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

因此,当我在IDE上运行时使用“data/zones/dynamic/myart.png”时,JAR将无法工作,直到我将其改为“data/zones/dynamic/myart.png”"... 这两个大写错误使资源无法查找。。。在Linux上开发的人没有这个问题,因为整个系统都是区分大小写的,他们习惯于对这些事情保持谨慎

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

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


祝你好运

那么,JAR文件的类路径中是否有
files/WorldState1.txt
?键入
jar-tvf your_jar.jar
,看看它是否在那里。另外,告诉我们您的项目,如果您使用的是Maven或Gradle.jar之类的框架,tvf会给我一个java.nio.file.NoSuchFileException:semestrophave.jar我没有使用任何框架,用JavaFX构建,只需在
semestrophave.jar
的相同位置运行它即可。它运行了吗?上面写着files/WorldState1.txt,所以我猜它就在那里了。
getResource
是否总是相对于类路径的开头?OP在哪里说它使用了Java 9?顺便说一句,我使用的是Java 10,不知道它被弃用了。它改变了模块性,可能会导致问题。因此,如果我在files/GameReader中,那么获取WorldState路径的正确方法是这样的。getClass().getResource(“.WorldState1.txt”),因为WorldState也在文件中。虽然文件名为“WorldState1.txt”而不是“not.WorldState1.txt”,但这似乎不起作用
new BufferedReader(new InputStreamReader(resource, StandardCharsets.UTF_8)).lines().collect(Collectors.toList());