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

Gluon FX原生Windows应用运行报错:java.library.path无glib-lite

JavaFX吃豆人游戏Windows原生exe打包音频加载问题

背景

目标是为自研JavaFX吃豆人游戏生成Windows平台.exe可执行文件,项目地址:https://github.com/armin-reichert/pacman-javafx。已按照Gluon官方文档Windows平台章节指引安装所有必需工具,文档地址:https://docs.gluonhq.com/#platforms_windows。

调试进展

更新1:基础打包流程已打通

移除Maven artifact名称及所有路径中的连字符后,执行mvn clean install可实现以下操作:

  • 通过mvn gluonfx:run或mvn gluonfx:runagent命令正常启动运行应用
  • 通过mvn gluonfx:build、mvn gluonfx:package命令构建Windows原生应用,暂未确认是否需要额外执行mvn gluonfx:install命令

最初通过mvn gluonfx:nativerun运行原生应用时,因资源无法加载抛出异常,该问题已修复。应用为模块化项目,模块名为de.amr.games.pacman.ui.fx,所有资源文件均存放在src/main/resources/de/amr/games/pacman/ui/fx路径的子目录下。目前应用在Eclipse IDE中、通过上述gluonfx相关Maven目标均可正常运行,但最初构建的原生版本无法访问音效等资源。

更新2:添加音频资源规则后报原生库缺失错误

为让原生镜像正常加载.mp3、.wav格式音频文件,在src\main\resources\META-INF\native-image\resource-config.json文件的resources配置块中添加了如下规则:

"includes":[
  {"pattern": ".*\\.mp3$"},
  {"pattern": ".*\\.wav$"},
]

配置完成后运行原生应用,抛出如下异常:

[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB] 06:46:02.273 INFO  de.amr.games.pacman.ui.fx.app.PacManGameAppFX - Starting application... [JavaFX Application Thread]
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB] 06:46:02.273 TRACE de.amr.games.pacman.ui.fx.sound.AbstractGameSounds - Try loading clip from 'resource:/de/amr/games/pacman/ui/fx/sound/pacman/pacman_death.wav' [JavaFX Application Thread]
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB] Exception in Application start method
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB] Exception in thread "main" java.lang.RuntimeException: Exception in Application start method
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB]    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:901)
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB]    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:196)
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB]    at java.lang.Thread.run(Thread.java:833)
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB]    at com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:704)
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB]    at com.oracle.svm.core.windows.WindowsPlatformThreads.osThreadStartRoutine(WindowsPlatformThreads.java:143)
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB] Caused by: java.lang.UnsatisfiedLinkError: no glib-lite in java.library.path
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB]    at com.oracle.svm.core.jdk.NativeLibrarySupport.loadLibraryRelative(NativeLibrarySupport.java:132)
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB]    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:47)
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB]    at java.lang.Runtime.loadLibrary0(Runtime.java:818)
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB]    at java.lang.System.loadLibrary(System.java:1989)
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB]    at com.sun.glass.utils.NativeLibLoader.loadLibraryInternal(NativeLibLoader.java:166)
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB]    at com.sun.glass.utils.NativeLibLoader.loadLibrary(NativeLibLoader.java:54)
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB]    at com.sun.media.jfxmediaimpl.NativeMediaManager.lambda$new$0(NativeMediaManager.java:111)
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB]    at java.security.AccessController.executePrivileged(AccessController.java:145)
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB]    at java.security.AccessController.doPrivileged(AccessController.java:569)
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB]    at com.sun.media.jfxmediaimpl.NativeMediaManager.<init>(NativeMediaManager.java:108)
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB]    at com.sun.media.jfxmediaimpl.NativeMediaManager$NativeMediaManagerInitializer.<clinit>(NativeMediaManager.java:78)
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB]    at com.sun.media.jfxmediaimpl.NativeMediaManager.getDefaultInstance(NativeMediaManager.java:90)
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB]    at com.sun.media.jfxmedia.MediaManager.canPlayProtocol(MediaManager.java:78)
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB]    at com.sun.media.jfxmedia.locator.Locator.<init>(Locator.java:240)
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB]    at com.sun.media.jfxmediaimpl.NativeMediaAudioClip.<init>(NativeMediaAudioClip.java:53)
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB]    at com.sun.media.jfxmediaimpl.NativeMediaAudioClip.load(NativeMediaAudioClip.java:63)
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB]    at com.sun.media.jfxmediaimpl.AudioClipProvider.load(AudioClipProvider.java:66)
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB]    at com.sun.media.jfxmedia.AudioClip.load(AudioClip.java:135)
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB]    at javafx.scene.media.AudioClip.<init>(AudioClip.java:83)
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB]    at de.amr.games.pacman.ui.fx.sound.AbstractGameSounds.load(AbstractGameSounds.java:82)
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB]    at de.amr.games.pacman.ui.fx.sound.pacman.PacManGameSounds.<init>(PacManGameSounds.java:42)
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB]    at de.amr.games.pacman.ui.fx.shell.GameUI.<clinit>(GameUI.java:69)
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB]    at de.amr.games.pacman.ui.fx.app.PacManGameAppFX.start(PacManGameAppFX.java:100)
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB]    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:847)
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB]    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:484)
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB]    at com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:457)
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB]    at java.security.AccessController.executePrivileged(AccessController.java:169)
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB]    at java.security.AccessController.doPrivileged(AccessController.java:399)
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB]    at com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:456)
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB]    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB]    at com.oracle.svm.jni.JNIJavaCallWrappers.jniInvoke_VA_LIST_Runnable_run_16403f8d32adb631126daa893e5e80085c5d6325(JNIJavaCallWrappers.java:0)
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB]    at com.sun.glass.ui.win.WinApplication._runLoop(WinApplication.java)
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB]    at com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:184)
[Sa. Juli 02 06:46:02 MESZ 2022][INFO] [SUB]    ... 3 more

经排查,问题疑似与resource: URL协议相关:代码中使用getClass().getResource(...)方法获取资源,执行mvn gluonfx:runagent时返回的URL为file:协议,可正常加载音效;移除音效加载逻辑后应用可正常运行,该问题是目前仅剩的故障点。

更新3:确认故障触发点

注释掉代码中JavaFX AudioClip对象的创建逻辑后,原生应用可完全正常运行。

更新4:匹配已知问题

判断该问题与Gluon Substrate的已知issue相关,对应issue地址:https://github.com/gluonhq/substrate/issues/336

更新5:Gluon Attach方案验证失败

尝试使用Gluon Attach库解决音频加载问题,发现Desktop平台未提供音频服务实现,无法通过Gluon Attach在Windows原生应用中加载音频文件。

现寻求该问题的可行解决思路。

Armin Reichert


内容的提问来源于stack exchange,提问作者Armin Reichert

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 21:42:12