我已经尝试解决这个问题已经好几个小时了。我有一个以 .jar 格式导出的 java 程序。jar 工作正常,但我想 a) 将它捆绑到 MacOS 应用程序 (.app) b) 在应用程序中包含 JRE。我使用 packr https://github.com/libgdx/packr来实现这一点。但是,packr 制作的应用程序存在一些问题。当我启动它时我得到了这个:
Exception in thread "Thread-1" java.lang.NoClassDefFoundError: com/sun/media/sound/JDK13Services
at javax.sound.sampled.AudioSystem.getProviders(AudioSystem.java:1629)
at javax.sound.sampled.AudioSystem.getAudioFileReaders(AudioSystem.java:1404)
at javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1105)
at Audio.AudioPlayer.<init>(AudioPlayer.java:11)
at GameState.MenuState.<init>(MenuState.java:45)
at GameState.GameStateManager.loadState(GameStateManager.java:51)
at GameState.GameStateManager.<init>(GameStateManager.java:46)
at Main.GamePanel.init(GamePanel.java:58)
at Main.GamePanel.run(GamePanel.java:63)
at java.lang.Thread.run(Thread.java:744)
查看堆栈跟踪,它显然与音频 IO 有关;这一假设也与程序似乎在使用音频之前一直运行的印象一致;但我只是不知道要改变什么,因为 .jar 工作得很好。
packr 的配置文件如下所示:
{
"platform": "mac",
"jdk": "/Users/.../bounces/openjdk-1.7.0-u45-unofficial-icedtea-2.4.3-macosx-x86_64-image.zip",
"executable": "Moths",
"classpath": [
"/Users/.../bounces/Moths_JRE_1.7_beadz.jar"
],
"mainclass": "Main.Game",
"vmargs": [
],
"resources": [
],
"minimizejre": "soft",
"output": "/Users/.../bounces/Moths.beadz.app",
"icon": "/Users/.../bounces/icon.icns"
}
有任何想法吗?
更新:解决方案 它与音频 I/O 无关,实际上解决方案要简单得多:packr 有一个可选的最小化例程,它在打包之前删除 JRE 的不必要部分,以使应用程序包尽可能小可能的。不幸的是,com.sun.media 是被删除的软件包之一。解决方案:打包前禁用最小化选项。