JavaFX应用启动失败报NoSuchMethodError错误求助
JavaFX启动Jar报错
java.lang.NoSuchMethodError: notifyPreferencesChanged解决办法 问题重现
在Windows 10 x64环境下,使用JDK21 + JavaFX18开发的应用,两台测试电脑运行正常,但朋友电脑启动Jar时出现如下错误:
Exception in thread "JavaFX-Launcher" java.lang.NoSuchMethodError: notifyPreferencesChanged at com.sun.glass.ui.win.WinApplication.initIDs(Native Method) at com.sun.glass.ui.win.WinApplication.<clinit>(WinApplication.java:111) at com.sun.glass.ui.win.WinPlatformFactory.createApplication(WinPlatformFactory.java:39) at com.sun.glass.ui.win.WinPlatformFactory.createApplication(WinPlatformFactory.java:36) at com.sun.glass.ui.Application.run(Application.java:146) at com.sun.javafx.tk.quantum.QuantumToolkit.startup(QuantumToolkit.java:290) at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:293) at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:163) at com.sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.java:659) at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:679) at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:196) at java.base/java.lang.Thread.run(Thread.java:1583) # # A fatal error has been detected by the Java Runtime Environment: # # EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ff8f2b08082, pid=10752, tid=7420 # # JRE version: Java(TM) SE Runtime Environment (21.0.2+13) (build 21.0.2+13-LTS-58) # Java VM: Java HotSpot(TM) 64-Bit Server VM (21.0.2+13-LTS-58, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, g1 gc, windows-amd64) # Problematic frame: # V [jvm.dll+0x448082] # # No core dump will be written. Minidumps are not enabled by default on client versions of Windows # # An error report file with more information is saved as: # E:\hs_err_pid10752.log # # If you would like to submit a bug report, please visit: # https://bugreport.java.com/bugreport/crash.jsp #
问题原因
JavaFX 18基于JDK17构建,其原生组件依赖的JDK内部方法(如notifyPreferencesChanged)在JDK21中已被修改或移除,导致版本不兼容,触发方法找不到错误及JVM崩溃。手动复制dll到JDK目录的操作不仅无效,还可能引入版本混乱问题。
解决步骤
- 升级JavaFX版本到兼容JDK21的版本:JavaFX从19版本开始支持JDK21,建议直接升级到JavaFX 21 LTS(与JDK21版本对齐,兼容性最佳)。
- 清理手动复制的dll文件:删除之前复制到JDK lib目录的所有JavaFX相关dll,避免残留旧库干扰运行。
- 采用标准方式部署应用:
- 模块化项目:使用
jlink工具生成包含JDK和JavaFX依赖的自定义运行时镜像,朋友电脑无需单独安装JDK/JavaFX,直接运行生成的启动脚本或exe即可。 - 非模块化项目:使用Maven/Gradle的JavaFX插件生成包含所有依赖的可执行Jar,或通过指定模块路径启动,示例命令:
java --module-path "path/to/javafx-21/lib" --add-modules javafx.controls,javafx.fxml -jar your-app.jar
- 模块化项目:使用
- 验证朋友电脑的JDK环境:让朋友执行
java -version和javac -version,确认JDK版本确实为21.0.2,且系统PATH中无其他版本Java的干扰。
内容的提问来源于stack exchange,提问作者Sara Khelifi
相关产品推荐
相关产品推荐

