音频文件在Eclipse IDE中播放; 但不是作为JAR文件

我正在使用的音频文件位于: http : //www.orangefreesounds.com/loud-alarm-clock-sound/

这是我的Eclipse IDE中的文件结构: 我的文件结构是什么样的

当我在IDE中运行时,音频文件播放完全正常,但是当我将其作为JAR文件导出时则不会。 我已经检查过并发现音频文件在JAR文件中。

我使用终端命令java -jar Sandbox.jar &来运行JAR文件。 该程序似乎能够找到该文件(因为它没有抛出IOException),但似乎无法执行播放。

为什么会出现这个问题,我该如何解决?

奇怪的更新

好的,实际上,JAR文件能够在Windows 8.1上的cmdPowerShell运行时播放音频文件,但出于某种原因不能在Ubuntu 14.04的终端中播放。 这一次,我一直在尝试在Ubuntu 14.04中运行JAR文件。

奇怪的更新#2

我已确认JAR文件的问题仅适用于Windows 8.1系统。 这个问题中的两个代码片段都不起作用,而MadProgrammer的两个解决方案都有效。

最小,完整和可validation的示例(不适用于Windows或Ubuntu)

 import java.io.IOException; import java.net.URL; import javax.sound.sampled.*; public class Sandbox { public static void main(String[] args) throws UnsupportedAudioFileException, IOException, LineUnavailableException { URL url = Sandbox.class.getResource("/sound-effects/alarmSoundClip.wav"); AudioInputStream ais = AudioSystem.getAudioInputStream(url); AudioFormat af = ais.getFormat(); DataLine.Info info = new DataLine.Info(Clip.class, af); Clip clip = (Clip) AudioSystem.getLine(info); clip.open(ais); clip.start(); } } 

尝试解决方案#1(在Windows或Ubuntu上不起作用)

一个尝试的解决方案(由Andrew Thompson建议)是编写this.getClass().getResource( ... )而不是Sandbox.class.getResource(…):

 import java.io.IOException; import java.net.URL; import javax.sound.sampled.*; public class Sandbox { public static void main(String[] args) throws UnsupportedAudioFileException, IOException, LineUnavailableException { new Sandbox(); } public Sandbox() throws UnsupportedAudioFileException, IOException, LineUnavailableException { URL url = this.getClass().getResource("/sound-effects/alarmSoundClip.wav"); AudioInputStream ais = AudioSystem.getAudioInputStream(url); AudioFormat af = ais.getFormat(); DataLine.Info info = new DataLine.Info(Clip.class, af); Clip clip = (Clip) AudioSystem.getLine(info); clip.open(ais); clip.start(); } } 

clip.drain()之后添加clip.drain()似乎对我clip.start() IDE和命令行有和没有&

 import java.io.IOException; import java.net.URL; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.Clip; import javax.sound.sampled.DataLine; import javax.sound.sampled.LineUnavailableException; import javax.sound.sampled.UnsupportedAudioFileException; public class Sandbox { public static void main(String[] args) { try { URL url = Sandbox.class.getResource("/sound-effects/Loud-alarm-clock-sound.wav"); AudioInputStream ais = AudioSystem.getAudioInputStream(url); AudioFormat af = ais.getFormat(); DataLine.Info info = new DataLine.Info(Clip.class, af); Clip clip = (Clip) AudioSystem.getLine(info); clip.open(ais); clip.start(); System.out.println("Drain..."); clip.drain(); System.out.println("...Drained"); } catch (UnsupportedAudioFileException | IOException | LineUnavailableException exp) { exp.printStackTrace(); } } } 

现在,话虽如此,我发现过去的drain有点不可靠,特别是当有多个声音在播放时,我倾向于使用LineListener

例如…

 import java.io.IOException; import java.net.URL; import java.util.logging.Level; import java.util.logging.Logger; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.Clip; import javax.sound.sampled.DataLine; import javax.sound.sampled.LineEvent; import javax.sound.sampled.LineListener; import javax.sound.sampled.LineUnavailableException; import javax.sound.sampled.UnsupportedAudioFileException; public class Sandbox { protected static final Object LOCK = new Object(); public static void main(String[] args) { try { URL url = Sandbox.class.getResource("/sound-effects/Loud-alarm-clock-sound.wav"); AudioInputStream ais = AudioSystem.getAudioInputStream(url); AudioFormat af = ais.getFormat(); DataLine.Info info = new DataLine.Info(Clip.class, af); Clip clip = (Clip) AudioSystem.getLine(info); clip.open(ais); clip.addLineListener(new LineListener() { @Override public void update(LineEvent event) { System.out.println(event.getType()); if (event.getType() == LineEvent.Type.STOP) { synchronized (LOCK) { LOCK.notify(); } } } }); clip.start(); synchronized (LOCK) { LOCK.wait(); } } catch (UnsupportedAudioFileException | IOException | LineUnavailableException | InterruptedException exp) { exp.printStackTrace(); } } }