You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

打包后sun.audio无法运行,报java.lang.NoClassDefFoundError问题求助

解决Java打包后sun.audio.AudioStream找不到的问题

这个问题我之前也碰到过,核心原因是你用的sun.audio包属于Sun/Oracle JDK的非公开内部API,并非Java标准库的一部分:

  • 在Eclipse里能正常运行,大概率是因为你开发时用的JDK(比如Java 8)默认允许访问这些内部类,但打包后运行环境的JVM(尤其是Java 9及以上版本)会严格限制对内部API的访问,直接触发NoClassDefFoundError。
  • 另外像OpenJDK这类第三方JDK发行版,很多根本就不包含sun.audio这个包,这也会导致打包后运行报错。

推荐解决方案:改用标准Java Sound API

官方推荐的音频处理方案是javax.sound.sampled包,这是Java标准库的一部分,兼容性和稳定性都有保障。把你的代码替换成下面的实现:

import javax.sound.sampled.*;
import java.io.File;

// 播放音频的方法
public void playAudio(File file) {
    try {
        AudioInputStream audioStream = AudioSystem.getAudioInputStream(file);
        Clip clip = AudioSystem.getClip();
        clip.open(audioStream);
        clip.start();
        
        // 可选:如果需要等待音频播放完成后释放资源,可以添加这段监听
        clip.addLineListener(event -> {
            if (event.getType() == LineEvent.Type.STOP) {
                clip.close();
                audioStream.close();
            }
        });
    } catch (Exception e) {
        Log.append(e.getMessage());
        e.printStackTrace();
    }
}

临时兼容方案(不推荐,仅用于旧代码过渡)

如果你一定要保留sun.audio的代码,可以尝试以下操作,但注意这只是临时方案,后续JDK版本可能彻底移除这个API:

  • 如果使用Java 9及以上版本,在运行打包后的程序时添加JVM参数,允许访问内部API:
    java --add-exports java.desktop/sun.audio=ALL-UNNAMED -jar your-application.jar
    
  • 确保你打包和运行时使用的是Oracle JDK 8(不推荐,因为Java 8已停止官方支持),并且打包过程中没有排除sun.audio相关类。

内容的提问来源于stack exchange,提问作者Jonas Re

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:43:42