声音没有在jar子里播放
我已将所有类文件和资源打包为jar但在执行时声音文件不会播放。 我的包结构是:
+project |_classes |_ _*.class |_resources |_ _ *.jpg,*.wav
码:
AudioInputStream inputStream = AudioSystem.getAudioInputStream(kidsClassRoom.class.getResourceAsStream("../resources/"+file));
执行此行时获取null
!
对已经提出的理论的替代理论。 通常成功的getResource()调用依赖于调用它们来定位它们的类加载器实例。 出于这个原因,我建议使用用户定义对象的实例,从中调用getResource()。 例如
// Sanity check System.out.println("The value of 'file' is: " + file); // Presuming kidsClassRoom1 is an instance of kidsClassRoom AudioInputStream inputStream = AudioSystem. getAudioInputStream( kidsClassRoom1. getClass(). getResourceAsStream("/resources/"+file));
您可能还会注意到,代码段使用“/”前缀作为资源。 与其他人所说的相反,我确信这意味着“从资源路径的根源”,在运行时类路径中的Jar上找到它。 离开’/’或’../’将使类加载器在发生这种情况的类的子路径中搜索资源。
当然 – 确保Wav最终进入Jar! 将.jar复制/重命名为.zip并双击它是检查Windows上存档内容的“快速和脏”方法。
创建一个名为resources
的包,如下所示
然后
AudioSystem.getAudioInputStream(kidsClassRoom.class.getResourceAsStream("resources/"+file));
这是我在jar中播放循环声音文件的function,它对我来说很好。
似乎getResourceAsStream()
不适用于jar。 但是, getResource()
可以。
public synchronized void alarm() { try { crit = AudioSystem.getClip(); AudioInputStream inputStream1 = AudioSystem.getAudioInputStream(this.getClass().getResource("critical.wav")); crit.open(inputStream1); crit.loop(Clip.LOOP_CONTINUOUSLY); } catch (Exception e) { System.err.println(e.getMessage()); } }
当你执行getResourceAsStream
,它不是与当前类相关,而是与归档的根相对。 也就是说,首先尝试删除../
。
需要注意的重要一点是,在导出的jar中,资源不会存储为文件(请在某处阅读,请更多知识渊博的人输入)。 因此,最好先将资源作为URL对象获取,然后将其传递给AudioInputStream对象。
URL url = YourClass.class.getResource(filename); AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(url);
如果资源位于子文件夹中,请记住将其添加到文件名路径中。