gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 03:54:43 25 4
gpt4 key购买 nike

我是一个初学者,所以对不起,如果这个问题太基本了。

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

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

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

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

在我发现的大多数答案中,它们都非常重视如何在代码内部“获取”资源。实际上,它教会了我更好的方法。我使用一种很奇怪的方法来获取文件的绝对路径...但是后来我使用了:

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

现在我正在使用(具有相同的结果):
ClassLoader.getSystemResource("sound.wav");

在文件名(“/sound.wav”)之前,两个“资源获取”选项也都用斜杠进行了尝试,再次产生了与我已经公开的相同的无效结果。

就像我在问题标题中提到的那样,为了完全清楚起见,我正在 IntelliJ IDE中使用 Gradle 项目。

预先感谢您的帮助。

最佳答案

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

您首先使用URL res = ClassLoader.getSystemResource("sound.wav");获取资源的URL,然后使用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中加载资源流,并且文件将播放。

有关更多详细信息,请参见 this answer

您的应用无法与Gradle一起运行,因为IntelliJ IDEA Gradle中的 there is no support for GUI Designer尚未构建。

要构建jar,我必须手动创建一个 Artifact ,并创建 include the sound file there

关于java - 如何使用IntelliJ IDE将媒体资源正确地添加到(Java)Gradle工件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61803793/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com