【问题标题】:How do you properly include a resource folder in a JAR artifact in IntelliJ IDEA?如何在 IntelliJ IDEA 的 JAR 工件中正确包含资源文件夹?
【发布时间】:2018-04-26 18:41:46
【问题描述】:

我有一个项目,它从名为 res 的文件夹中读取图形和声音效果。此文件夹与 src 文件夹位于同一目录级别。我已将 res 标记为 Resources Root。

我将我的工件配置为通过以下方式将 res 作为内容目录包含在内 项目结构 -> 工件 -> 添加(Alt + Insert) -> JAR

然后,在输出布局选项卡中,我按下了添加下拉框 -> 目录内容 -> res

当我在 Intellij 中运行项目时,它发现资源很好。这是一个代码 sn-p 显示我如何访问资源:

public static final Sfx VOID_SOUND = new Sfx(TinySound.loadSound(new File("res/audio/sfx/void_sound.wav")));

但是,当我构建独立工件,然后运行 ​​jar 时,它会通过将我机器的父目录添加到文件路径来查找资源,一直到根目录。下面是终端输出的样子:

/home/user/Demo/res/audio/sfx/void_sound.wav (No such file or directory)
Error getting resource stream!

有没有办法将工件构建配置到正确位置?我希望将资源包含在 jar 文件中,以便它充当没有外部依赖项的独立 jar。

【问题讨论】:

    标签: java file intellij-idea jar


    【解决方案1】:

    我对 Linux 不熟悉,所以请谨慎对待。但对我来说,它看起来像是试图从它没有权限的地方访问文件。您是否尝试将文件或目录移动到任何用户都可以访问的共享位置?

    【讨论】:

    • 它肯定在该目录中具有权限,因为它位于我的用户帐户的主目录中。我的帐户是这台机器上除 root 以外的唯一其他帐户,因此这是最接近共享位置的帐户。它不能拥有权限的唯一方法是,如果它位于标有仅 root 权限的目录中。
    【解决方案2】:

    您模块的Content root 中来自resource/source folders 的所有文件都包含在artifact build 上的工件中。您可以自己探索生成的工件内容(工件放置在 Artifct 的Generat Settings输出目录字段中指定的目录中)。

    确保为文件指定正确的目录。例如。如果res文件夹被标记为模块的resource root,则工件中的文件路径名将从res目录内的子文件夹开始,即audio/sfx/void_sound.wav

    【讨论】:

      【解决方案3】:

      现在我明白为什么它不起作用了。这是因为 JAR 工件中包含的资源必须包含在类路径中,并且可以使用 getResource() 访问。必须使用文件路径访问类路径之外的资源。如果您使用相对路径,它将解析到启动 JAR 的 pwd 表单的位置,而不是 JAR 内部,因此它解析回根目录的原因。解决方案是将资源放在类路径中,并使用getClass().getResource()getClass().getLoader().getResource() 访问它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-16
        • 2021-10-19
        • 2012-08-03
        • 2019-06-04
        • 2022-01-24
        • 2016-04-29
        相关资源
        最近更新 更多