从.jar制作MacOS应用程序包时出现NoClassDefFoundError

时间:2016-10-14 23:39:16

标签: java macos jar openjdk packr

我一直试图解决这个问题几个小时。我有一个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是被删除的软件包之一。解决方案:在打包前禁用最小化选项。

1 个答案:

答案 0 :(得分:0)

com/sun/media/sound/JDK13Services位于rt.jar对于MacOS,它名为classes.jar,位于/System/Library/Frameworks/<java_version>/Classes下。确保已将其包含在类路径中