如何使用IntelliJ IDE将媒体资源正确添加到(Java)Gradle工件中?



我是初学者,所以如果问题太基本,我很抱歉。

我刚刚构建了一个基于 GUI 的小程序,该程序在给定的秒数后连续重复某种声音(现在是一个简短的警报声音(,从而产生声音周期。

问题是当我在 IDE 中运行该程序时,它运行良好。但是,当我构建它时,构建的工件(*.jar文件(无法正常工作。我的意思是,一切正常,但它没有播放声音。

我一直在社区中寻找答案,并找到了一些有关如何正确构建工件的说明。目前,它们大多数时候都是基于 Maven 设置的。无论哪种方式,我都使用了这些答案,但我得到的 *.jar 文件内部没有资源。因此,两者都不是必需的声音文件。 我尝试使用项目工件选项手动放置 *.wav 文件,但这也没有奏效,即使我在构建的 *.jar 文件工件中肯定地获取声音文件。

我还尝试将程序转换为控制台程序(非 GUI(以查看任何可能的异常,但随后我的程序根本没有播放任何声音。甚至没有从 IDE 运行它。所以,情况变得更糟,事实上,这是一个不同的问题,我不想在这里混在一起,我希望我在这一点上没有错。

在我找到的大多数答案中,他们都非常重视如何在代码中"获取"资源。事实上,它教会了我一个更好的方法。我使用了一种非常奇怪的方法来获取文件的绝对路径......但后来我使用了:

MyClass.class.getResource("sound.wav");

现在我正在使用(具有相同的结果(:

ClassLoader.getSystemResource("sound.wav");

这两个"资源获取"选项也都尝试过在文件名("/sound.wav"(前使用斜杠,再次出现与我已经暴露的相同的非生产性结果。

为了完全清楚,正如我在问题标题中提到的,我正在IntelliJIDE中使用Gradle项目。

提前感谢您的帮助。

用于从类路径将资源作为流加载的代码不正确。

您首先使用URL res = ClassLoader.getSystemResource("sound.wav");获取资源的 URL,然后使用getPath()方法将其转换为String

当资源不在罐子中时,它可以工作。但是当它在 jar 中时,文件 URL 变得无效,代码失败并显示FileNotFoundException.

取而代之的是,您需要更改MediaPlayer#playSound中的代码,替换

final AudioInputStream in = AudioSystem.getAudioInputStream(fileUrl);

以下作为快速解决方案:

InputStream is = getClass().getResourceAsStream("/sound.wav");
final AudioInputStream in = AudioSystem.getAudioInputStream(new BufferedInputStream(is));

这将直接从 jar 加载资源流,文件将播放。

有关更多详细信息,请参阅此答案。

您的应用将无法与 Gradle 一起运行,因为 IntelliJ IDEA Gradle 版本中尚不支持 GUI Designer。

为了构建jar,我必须手动创建一个工件,并将声音文件包含在其中。

最新更新