如何在IntelliJ IDEA中的JAR工件中正确包含资源文件夹?

时间:2017-11-13 23:28:20

标签: java file intellij-idea jar

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

我将我的工件配置为包含res作为内容目录 项目结构 - >文物 - >添加(Alt + Insert) - > JAR

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

当我在Intellij中运行项目时,它会发现资源很好。这是一段代码片段,展示了我如何访问资源:

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

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

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

有没有办法将工件构建配置到适当位置的工件?我想要包含在jar文件中的资源,因此它充当独立的jar,没有外部依赖。

3 个答案:

答案 0 :(得分:0)

我对Linux并不熟悉,所以请大家多加一点。但对我来说,它似乎试图从它没有权限的地方访问该文件。您是否尝试将文件或目录移动到任何用户都可以访问的共享位置?

答案 1 :(得分:0)

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

确保为文件指定正确的目录。例如。如果res文件夹被标记为模块resource root,则工件中的文件路径名将从res目录中的子文件夹开始,即{{1} }}

答案 2 :(得分:0)

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