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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 09:15:19