JavaFX添加MediaView触发IllegalAccessError问题求助
嘿,我帮你梳理下这个问题的核心原因和解决办法,你遇到的这个错误其实是JavaFX模块化加载冲突导致的:
问题根源分析
你的启动命令里有个关键失误:同时在classpath和--module-path中包含了JavaFX的jar文件。JavaFX 13是完全模块化的框架,当你把javafx.media.jar放到classpath时,它会被加载到「未命名模块」里,而不是作为正式的javafx.media模块运行。这种情况下,它没法访问javafx.graphics模块中未对外公开的内部包com.sun.javafx.sg.prism,于是就抛出了IllegalAccessError。
具体解决方案
1. 清理Classpath中的JavaFX依赖
把classpath里所有JavaFX相关的jar都删掉,包括:javafx-swt.jar、javafx.base.jar、javafx.controls.jar、javafx.fxml.jar、javafx.graphics.jar、javafx.media.jar、javafx.swing.jar、javafx.web.jar
这些jar已经通过--module-path指定了,完全不需要重复放到classpath里。
2. 明确添加javafx.media模块到启动参数
在--add-modules里加上javafx.media,毕竟你用到了MediaView,必须加载这个模块才能正常工作。
修正后的完整启动命令
"C:\Program Files\Java\jdk-13\bin\java.exe" --module-path "C:/Program Files/Java/javafx-sdk-13/lib" --add-modules javafx.controls,javafx.fxml,javafx.graphics,javafx.media --add-reads javafx.base=ALL-UNNAMED --add-reads javafx.graphics=ALL-UNNAMED -Djava.library.path=C:\Germaneers\JavaWorkspace\19-AU-EE74-001-Kombianzeige-im-Schwarzdruck-App\lib "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2019.2\lib\idea_rt.jar=58845:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2019.2\bin" -Dfile.encoding=UTF-8 -classpath "C:\Germaneers\JavaWorkspace\19-AU-EE74-001-Kombianzeige-im-Schwarzdruck-App\out\production\19-AU-EE74-001-Kombianzeige-im-Schwarzdruck-App;C:\Germaneers\JavaWorkspace\19-AU-EE74-001-Kombianzeige-im-Schwarzdruck-App\lib\kotlin-stdlib.jar;C:\Germaneers\JavaWorkspace\19-AU-EE74-001-Kombianzeige-im-Schwarzdruck-App\lib\kotlin-reflect.jar;C:\Germaneers\JavaWorkspace\19-AU-EE74-001-Kombianzeige-im-Schwarzdruck-App\lib\kotlin-test.jar;C:\Germaneers\JavaWorkspace\19-AU-EE74-001-Kombianzeige-im-Schwarzdruck-App\lib\kotlin-stdlib-jdk7.jar;C:\Germaneers\JavaWorkspace\19-AU-EE74-001-Kombianzeige-im-Schwarzdruck-App\lib\kotlin-stdlib-jdk8.jar" main.Main
3. 可选:推荐使用模块化项目结构
如果你的项目是模块化的,在module-info.java里添加对javafx.media的依赖:
module your.module.name { requires javafx.controls; requires javafx.fxml; requires javafx.media; // 若主类在该模块下,需要导出对应包或声明模块为open exports main; }
这样启动时可以简化--add-modules参数,只需要指定你的模块名就行。
为什么之前的尝试没生效?
升级到JavaFX 13方向是对的,但你没解决核心的「模块加载冲突」——classpath里的JavaFX jar干扰了模块化加载流程,导致javafx.media没以模块身份运行,自然没法访问其他模块的内部API。
内容的提问来源于stack exchange,提问作者Crainko

