如何在编译 TO 和 NOT TO JAR 文件时以相同的方式指定资源位置

How to specify resource location in the same way when compiling TO and NOT TO a JAR file

提问人:davidalayachew 提问时间:8/4/2023 更新时间:8/4/2023 访问量:55

问:

我有一个项目,我正在使用 .我希望能够获取资源,而不必先将我的项目构建到 JAR 文件中,但与此同时,我也不想对位置进行硬编码 (C://Users/name/etc)。javac

我知道,如果我有一个JAR文件,我可以从那里使用并调用资源方法之一。或者,如果我的资源包含在另一个 JAR 文件中,并且该 JAR 文件位于我的类路径上,那么我可以以类似的格式从 JAR 文件中获取它。ClassLoader

但是,当我只在javac中编译时,我该怎么做呢?当我最终将其转换为 JAR 文件时,我不想重新设计我所有的资源获取逻辑,但我也不想每次编译时都制作一个 jar 文件并想要测试更改。我只是希望能够向 Java 指定这是查找我的资源的位置,当我最终决定制作 JAR 文件时,我不想改变该策略。

Java JAR 资源 组织 getresource

评论

1赞 gdomo 8/4/2023
您可以像在 jar 中一样在文件夹中查找资源。只需确保包含资源的文件夹以 -cp 提供正确的根目录即可
0赞 davidalayachew 8/4/2023
@gdomo 把它写进一个答案,我会接受的。
2赞 user16320675 8/4/2023
假设?好吧,如果代码正在运行,ClassLoader 肯定找到了正在运行的类,或者?如果资源与类共享相同的位置(一起部署),则不需要额外的条目(或) - 当然,如果您需要一个单独的位置,则必须将其添加到类路径中-cpCLASSPATH
1赞 user16320675 8/4/2023
没关系 - 我没有提到任何关于 aled 的评论或你对它的回复(或者至少我是这么认为的)——只是“不依赖于假设”让我觉得你不明白我想说什么......无论如何,ClassLoader 使用与类相同的机制来查找/加载资源(无论是在 JAR、目录中还是??
2赞 user16320675 8/4/2023
有点像 XY 问题......就像真正的问题是应用程序是如何构建的 - 大多数IDE都会正确复制资源,大多数构建工具也是如此(我知道)

答:

1赞 gdomo 8/4/2023 #1

您可以像在 jar 中一样在文件夹中查找资源。只需确保在运行 java 时列出包含资源的文件夹,并且代码中的相对路径与之对应即可。-cp

下面是一个示例。

java -cp ".;first/path/to/resource/folder;second/path;third/path" PackageName.NameOfClassContainingMainMethod

也就是说,该资源可能位于已编译代码所在的同一文件夹中。在这种情况下,无需通过 显式提供它。-cp

每当您在代码中加载资源时,/ java 都会在类路径中查找它。提供 .jar(本质上只是一个压缩文件夹)和原始文件夹只是指定要加载到类路径中的内容的另一种方法。ClassLoader.getResourcegetResourceAsStream

评论

0赞 davidalayachew 8/4/2023
这很有帮助,非常感谢。您能否还包括有关 .jar 的部分,以及 .jar 的执行方法与 javac 相同?我觉得这真的有助于传达解决这个问题的方法在两种情况下实际上是相同的。
1赞 gdomo 8/4/2023
不知道我是否收到你的问题。我已经扩展了答案。如果还不够,请具体说明您的问题。
0赞 davidalayachew 8/4/2023
就是这样,ty vm