java - 如何以直接从 Eclipse 和可运行 JAR 中工作的方式从/src/main/resources 加载资源?

标签 java eclipse jar embedded-resource

我在 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/

相关文章:

java - 如何从 jar 文件中调用自定义方法

java - 从 Eclipse 的项目资源管理器 View 中删除项目 .jars

java - 压缩字符串并将其作为字符串存储在数据库中以供以后解压

java - 如何使用句柄在 android 中缩放 View ?

java - 为什么不在一个类中编码呢?

java - JTable 排序双错

xml - web.xml 文件是否已过时?

java - 如何调试 "try {...}" block 内的 Java 代码?

android - 缺少 Eclipse 函数/方法说明

java - 从 jar 中读取文件在 eclipse 中不起作用