繁体   English   中英

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

[英]How to add media resources properly into a (Java) Gradle artifact by using IntelliJ IDE?

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

我刚刚构建了一个基于 GUI 的小程序,它在给定的秒数后连续重复某种声音(现在是短暂的警报声),从而形成一个声音循环。

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

我一直在社区中寻找答案,并找到了一些关于如何正确构建工件的说明。 目前,它们大部分时间都基于 Maven 设置。 无论哪种方式,我都使用了这些答案,但是我得到的 *.jar 文件里面没有资源 所以,既不是所需的声音文件。 我尝试使用项目工件选项手动放置 *.wav 文件,但这也不起作用,即使我肯定会在内置的 *.jar 文件工件中获取声音文件。

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

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

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

现在我正在使用(结果相同):

ClassLoader.getSystemResource("sound.wav");

两个“资源获取”选项也都在文件名(“/sound.wav”)之前使用斜杠进行了尝试,同样,我已经暴露了同样的非生产性结果。

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

预先感谢您的帮助。

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

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

当资源不在 jar 中时,它可以工作。 但是当它在 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 加载资源 stream 并播放文件。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM