我有一个项目,可以从标有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,没有外部依赖。
答案 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()
访问它们。