// 开发环境正常,打包 JAR 后失效
FileInputStream file = new FileInputStream("./src/music/001.mid");
BufferedInputStream buf = new BufferedInputStream(file);
AudioStream audio = new AudioStream(buf);
AudioPlayer.player.start(audio);
项目结构:

JAR 包内资源非文件系统路径。打包后 ./src/music/001.mid 变为 JAR 内部条目 /music/001.mid,FileInputStream 只能读取外部文件。
// 任意类中均可调用,开发/打包环境通用
String resourcePath = "/music/001.mid"; // 以 / 开头表示 classpath 根
InputStream input = this.getClass().getResourceAsStream(resourcePath);
if (input == null) {
throw new IllegalStateException("资源未找到: " + resourcePath);
}
BufferedInputStream buf = new BufferedInputStream(input);
AudioStream audio = new AudioStream(buf);
AudioPlayer.player.start(audio);
| 调用方式 | 路径前缀 | 查找基准 | 示例 |
|---|---|---|---|
Class.getResourceAsStream() | 无 / | 当前类包目录 | getResourceAsStream("music/001.mid") → com/example/music/001.mid |
Class.getResourceAsStream() | / | Classpath 根目录 | getResourceAsStream("/music/001.mid") → /music/001.mid |
ClassLoader.getResourceAsStream() | 无 /(忽略前导 /) | Classpath 根目录 | getClassLoader().getResourceAsStream("music/001.mid") |
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.mid</include>
<include>**/*.wav</include>
</includes>
</resource>
</resources>
</build>
将音乐文件放置于 src/main/resources/music/001.mid,编译后自动进入 target/classes/music/ 并打包进 JAR。
// 使用 AudioSystem 获取流式音频输入
AudioInputStream ais = AudioSystem.getAudioInputStream(
this.getClass().getResourceAsStream("/music/001.mid")
);
Clip clip = AudioSystem.getClip();
clip.open(ais);
clip.start();