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

如何使用IntelliJ IDE将媒体资源正确地添加到(Java)渐变工件中?,java,gradle,intellij-idea,Java,Gradle,Intellij Idea,我是初学者,如果问题太简单,我很抱歉 我刚刚构建了一个基于GUI的小程序,在给定的秒数后连续重复某个声音(现在是一个短的报警声音),从而产生一个声音循环 问题是,当我在IDE中运行程序时,它运行得非常完美。但是,当我构建它时,构建的工件(*.jar文件)不能很好地工作。我的意思是,一切都很好,但没有声音 我一直在社区中寻找答案,我找到了一些关于如何正确构建工件的说明。目前,它们大多数时候都是基于Maven设置的。无论如何,我都使用了这些答案,但是我得到的*.jar文件中没有任何资源。因此,无论是

我是初学者,如果问题太简单,我很抱歉

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

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

我一直在社区中寻找答案,我找到了一些关于如何正确构建工件的说明。目前,它们大多数时候都是基于Maven设置的。无论如何,我都使用了这些答案,但是我得到的*.jar文件中没有任何资源。因此,无论是所需的声音文件。 我尝试使用项目工件选项手动放置*.wav文件,但这也不起作用,即使我确实在构建的*.jar文件工件中获得了声音文件

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

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

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

这两个“获取资源”选项也在文件名(“/sound.wav”)前用斜杠进行了尝试,同样的结果与我已经公开的结果相同

我想说清楚,正如我在问题标题中提到的,我正在IntelliJIDE中使用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加载资源流,并播放文件

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

您的应用程序将不会与Gradle一起运行,因为在IntelliJ IDEA中,Gradle尚未构建


要构建jar,我必须手动创建一个工件。

请压缩并共享一个小样本项目()。如果您将wav和其他资源文件放在
src/main/resources
目录中,它应该是现成的。因为它是一个非常小的项目,我刚刚从IntelliJ IDEA导出了它,并将它上传到workupload.com云上。下载链接是:。在IntelliJ上解压和导入项目后,您可能需要进入文件>设置>构建、执行、部署>构建工具>渐变->使用IntelliJ IDEA(而不是渐变)构建和运行,以使其正常工作。这也是我需要做的。。。谢谢你的帮助,@CrazyCoder。是的,sound.wav文件位于resources文件夹中,正确标记。
InputStream is = getClass().getResourceAsStream("/sound.wav");
final AudioInputStream in = AudioSystem.getAudioInputStream(new BufferedInputStream(is));