【问题标题】:Maven - Load resources from JAR?Maven - 从 JAR 加载资源?
【发布时间】:2013-12-10 21:23:54
【问题描述】:

在使用 Maven 将资源捆绑到 JAR 文件中时,我感觉我遗漏了一些关键的东西。我的目录结构是标准的 Maven 目录结构 (即\src\main\java,\src\main\resources)。

在使用 IDE 时,我将资源文件作为 \main\resources\images\blah... "),所以没有一条路径是正确的。

我的问题实际上有两个方面,第一个是我是否遗漏了一些明显的东西?第二个是处理这个问题的最佳方法是什么?我知道我可以在捆绑所有内容以进行部署时替换所有路径,或者将所有路径包含在 try/catch 块中,甚至更改 maven 输出目录,但我觉得这些不优雅,我遗漏了什么。 提前致谢。

编辑:我像这样引用资源文件: getClass().getResource("/main/resources/images/lightboardImage.jpg"));

EDIT2:这显然是一个 IDE 配置问题,可能是因为我使用 Maven 将一个旧项目转换为一个。我真的不明白它是如何配置错误的。我的文件夹结构是:

src/main/java
src/main/资源

我的类路径中有一个“src”条目<classpathentry kind="src" path="src"/>

如果我右键单击 /main/resources/images/ 文件夹并用作源文件夹,它会将类路径条目转换为 <classpathentry excluding="main/resources/images/" kind="src" path="src"/> 并创建一个类似 <classpathentry kind="src" path="src/main/resources/images"/> 的新条目。它也不起作用。

EDIT3:好吧,这真的很愚蠢,但我才意识到问题所在。我实际上并没有将 Maven 用于本地开发构建。它使用 Eclipse 内置的 Ant 配置或其他。 Maven 用于自动部署构建,因此存在问题。很抱歉浪费大家的时间。

【问题讨论】:

  • 在 JAR 中只有 \images\blah\main\resources\images\blah 是从 JAR 访问资源的错误方式。 '我引用资源文件'是什么意思,显示代码。
  • 是的,但是我必须处理两条不同的路径——一条用于开发,一条用于部署。我知道这可能是一种常见情况,但我想问是否有一种简单、优雅的方法可以避免这种情况。

标签: java eclipse maven


【解决方案1】:

在 Maven 的生命周期中,资源被复制到 target/classes。组装 JAR 时,target/classes 内容将转到 JAR 根目录。因此,如果您想加载 JAR 中的资源,您可以使用

getClass().getResource("/images/lightboardImage.jpg"));

除非您没有正确配置类路径,否则它应该在 IDE 中使用相同的路径。如果您使用的是 Eclipse,请检查 src/main/resources 是否标记为源文件夹。

【讨论】:

  • 我感觉这就是问题所在。我只有一个 src 类路径条目...<classpathentry kind="src" path="src"/>。我应该明确包含 main\resources 吗?
  • 您使用的是哪个 IDE?如果是Eclipse,是否安装了maven插件?
【解决方案2】:

这应该适用于 IDE 和 JAR。

getClass().getResource("images/lightboardImage.jpg");

来自src/main/resources 的文件被复制到target/classes

在运行时,所有资源都应该在类路径中显示为images/lightboardImage.jpg。这适用于我的 IDE。如果没有,请按照@juanluisrp 所述检查您的 IDE 配置。

从我的 IDE 执行的 Java 如下所示:

java  -classpath (...) /home/.../target/classes (...)

因此,运行时类路径配置为target/classes 目录。

【讨论】:

  • 问题不在于在 JAR 中加载路径后如何处理路径,问题在于它们位于开发环境和部署环境中的两个不同位置。我可以在 JAR 文件中使用getClass().getResource("images\lightboardImage"),它工作正常。现在的问题是我必须处理两个不同的路径,"/main/resources/images/lightboardImage""images/lightboardImage"
  • 不,当你执行程序时,有一个运行时路径可以这样访问:images/lightboardImage
【解决方案3】:

我认为这里的问题是您需要将 IDE 设置为指向 src/main/resources 作为类路径的一部分。然后,您可以使用 getClass().getResource("images\lightboardImage") 在 maven 和 IDE 下运行。

例如,在 Eclipse 中,您可以通过在 Project Explorer 中右键单击 src/main/resources 并单击 "Build Path" -> "Use as Source Folder" 来完成此操作

【讨论】:

  • 是的,我意识到这是 juanluis 发表评论后的问题。这在概念上似乎很奇怪......资源文件夹总是应该这样配置吗?
  • 它与类路径中的已编译类相关,而不是原始源文件夹。 Maven 将资源和 java 文件夹复制到目标中。 Eclipse 只是将源文件夹中所有非 java 的内容复制到目标文件夹中。如果文件夹中有 java 文件,另一个文件夹中有其他东西,eclipse 不在乎。使用 ant(或 javac)时,您需要将自己的复制作为单独的任务进行。估计maven群觉得把java和其他文件混在一起有点不干净,个人觉得找东西的时候需要大量的目录遍历,很不方便……
猜你喜欢
  • 1970-01-01
  • 2013-01-16
  • 2014-10-11
  • 1970-01-01
  • 1970-01-01
  • 2015-02-19
  • 2023-03-09
  • 2015-11-16
  • 2011-11-25
相关资源
最近更新 更多