【问题标题】:How to include resources AND dependencies in JAR?如何在 JAR 中包含资源和依赖项?
【发布时间】:2014-06-05 08:50:35
【问题描述】:

我有一个 Java 项目,它依赖于一个外部库并包含一个名为 template.pdf 的资源。该库位于我的工作区之外的文件夹中,并由项目使用Project -> Properties -> Build Path -> Libraries -> Add External Jar 引用。资源文件当前位于我的工作区的bin/ 文件夹中,因此我可以使用PDFProject.class.getResourceAsStream("/template.pdf") 访问它,它在Eclipse 和JAR 文件中都有效,假设我使用下面的方法1 导出JAR 文件。

我的目标是能够将项目导出到包含资源和依赖项的 JAR,同时还能够从 Eclipse 和 JAR 内部运行代码,而无需更改用于访问资源的代码或必须维护任何文件的多个副本。到目前为止,我已经尝试过:

  1. 使用Export -> JAR file 导出并勾选Export all output folders for checked projects 框。这会导出包含资源文件的 JAR,并允许使用来自 Eclipse 和 JAR 的相同路径 ("/template.pdf") 访问资源,但不提供将依赖项打包到 JAR 中的选项。
  2. 使用Export -> Runnable JAR file 导出并选择[Extract/Package] required libraries into generated JAR 选项。这会导出包含依赖项的 jar,但会忽略资源文件。
  3. 将资源文件移动到项目的src/目录下,然后使用上面的方法2导出。这会正确地将资源和依赖项打包到 JAR 中,但代码不会在未经修改的情况下在 Eclipse 中运行,因为 "/template.pdf" 不再位于类路径中。

我意识到我可以在导出后手动将资源放入 JAR,或者在 bin/src/ 中保留资源文件的副本,或者直接将库的源复制到我的项目中,但这些解决方案似乎作为一般做法效率低下。我的大部分搜索似乎表明像 Ant 或 Maven 这样的构建工具可能会提供一个可接受的解决方案,但如果可能的话,我更愿意在此时避免处理该学习曲线。有没有办法只使用基本的 Eclipse 导出选项和文件夹层次结构来创建上面指定的 JAR 文件?

编辑: Thorbjørn Ravn Andersen 在下面的评论确实帮助我发现了我在如何将资源文件添加到项目中的一个大错误。我没有使用 Eclipse 的 Import 功能,而是通过操作系统手动将文件复制到源文件夹,然后使用右键菜单中的 Refresh 来更新 Eclipse 中的 Package Explorer。我错误地认为这会对项目进行任何必要的更新,但我还需要事后清理项目以使文件反映在输出文件夹中(或者仅使用导入功能将文件添加到第一个地点)。

这基本上解决了我的问题,允许我只需要维护位于源文件夹中的资源文件的副本,但它确实会导致磁盘上有多个文件副本。对于我的小项目,这不是问题。但是,对于具有许多资源文件的大型项目,这可能会导致重复文件占用大量磁盘空间。肯定有一种方法可以在不重复的情况下达到类似的结果吗?

【问题讨论】:

  • 那么如果你清理你的项目,jar 文件会消失吗?
  • @Thorbjørn Ravn Andersen - 如果我清理,没有 jar 文件会消失,但 bin/ 文件夹中的 template.pdf 文件会。
  • 创建一个新的源文件夹并将您的 template.pdf 复制到其中。
  • 我创建了一个名为“resources”的新源文件夹并将 pdf 放入其中,但现在从 Eclipse 运行时“getResourceAsStream("/template.pdf")”失败。
  • 如果文件存在于源文件夹中,它应该显示在该项目的输出文件夹中。如果没有,您可能希望显示当前配置的屏幕截图。您必须让 Eclipse 了解您在最终 jar 中想要的每一件事!

标签: java eclipse jar build


【解决方案1】:

创建一个新的源文件夹并将 template.pdf 放在该文件夹下。然后更改 get resourceAsStream() 以包含新文件夹名称。

getResourceAsStream("\resources\template.pdf")

【讨论】:

  • 这在从 Eclipse 运行时不起作用,因为 getResourceAsStream() 开始查看从 Eclipse 执行时为“/bin/”(不是“ /",在其中创建新的源文件夹)。此外,使用此配置将项目导出到 JAR 时,资源文件不会放在任何文件夹中,而是放在 JAR 的顶层,使其路径为“/template.pdf”而不是“/templates” /template.pdf" 相对于 JAR 执行时的类路径。
  • 如果你右键项目并进入属性,新的源文件夹是在构建路径上吗?
  • 是的,templates/ 出现在构建路径上。
  • 必须是正斜杠。
【解决方案2】:

如果jar在resources文件夹中的路径中有文件,您可以在Project->Build path中添加jar并使用以下InputStream is = ClassLoader.getSystemResourceAsStream("resources/sample.txt");

这对我有用。

【讨论】:

    猜你喜欢
    • 2015-12-26
    • 2019-06-04
    • 1970-01-01
    • 2023-03-27
    • 2016-06-20
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多