我在 Eclipse 中有一个带有 main()
方法的 Maven 项目。该项目具有使用嵌入式资源的依赖项,即它包含 /src/main/resources
中的文件。我想从项目创建一个可运行的 JAR 文件。问题是 - 取决于我加载嵌入式资源的方式 - 我可以使用 java -jar my.jar
将项目作为可运行的 JAR 运行,或者我可以直接从 Eclipse 运行它,但不是两者都 - 原因是两种情况下这些资源的路径明显不同。
例如,我可以按如下方式加载资源:
// Loads /src/main/resources/script.rb;
// Works when run directly from Eclipse; throws an exception when run as a runnable JAR
InputStream resource = this.getClass().getResourceAsStream("/script.rb");
这样,我就可以直接从 Eclipse 成功运行该项目了。使用 Eclipse 的 Export → Runnable JAR file
创建可运行的 JAR 会将 script.rb
资源放入 JAR 根目录的 resources
文件夹中,这使得当我尝试将其作为 java -jar my.jar
运行时,上面的代码失败。我可以通过更改代码以指向 /resources
文件夹来解决此问题:
// Works when run as 'java -jar my.jar', fails when run from Eclipse.
InputStream resource = this.getClass().getResourceAsStream("/resources/script.rb");
现在,导出的 JAR 文件工作正常,但我无法再直接从 Eclipse 成功地将项目作为 Java 应用程序运行。
我阅读了其他几篇有关加载资源的文章,但到目前为止没有任何帮助。
有没有办法解决这个问题并以在两种情况下都能正常工作的方式加载资源?可能有效的方法是说服 Eclipse 将资源放入 JAR 的根目录中,而不是放在 resources
文件夹中,但我不确定这是否可行。
最佳答案
使用Class.getResourceAsStream(...)
将相对于包进行加载。您应该使用 Classloader.getResourceAsStream(...)
从根加载。
例如
InputStream resource = this.getClass().getClassloader().getResourceAsStream("script.rb");
(假设src/main/resources
位于ecliplse类路径上)
注意:/
已被删除!
关于java - 如何以直接从 Eclipse 和可运行 JAR 中工作的方式从/src/main/resources 加载资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40024242/