JavaFX WebView启动报IllegalAccessError问题求助
解决JavaFX 11中WebView引发的IllegalAccessError问题
你遇到的核心问题有两个:一是VM参数漏掉了WebView所属的javafx.web模块,二是缺少必要的内部包导出权限。
先看错误信息里的关键提示:
Caused by: java.lang.IllegalAccessError: superclass access check failed: class com.sun.java.scene.web.WebViewHelper (in unnamed module @0x9efe064) cannot access class com.sun.javafx.scene.ParentHelper (in module javafx.graphics) because module javafx.graphics does not export com.sun.javafx.scene to unnamed module @0x9efe064
这说明两点:
- 你的代码用到了
javafx.web模块里的WebView,但当前VM参数的--add-modules里没包含这个模块,导致WebView的辅助类只能加载到未命名模块中。 javafx.graphics模块没有把内部的com.sun.javafx.scene包导出给未命名模块,导致WebView的辅助类无法访问ParentHelper。
正确的VM参数配置
把你的VM参数替换成下面的完整版本:
--module-path /home/zahar/IdeaProjects/openjfx-11.0.2_linux-x64_bin-sdk/javafx-sdk-11.0.2/lib --add-modules=javafx.controls,javafx.fxml,javafx.graphics,javafx.web --add-exports javafx.graphics/com.sun.javafx.scene=ALL-UNNAMED --add-exports javafx.graphics/com.sun.javafx.sg.prism=ALL-UNNAMED
关键修改点说明
- 添加
javafx.web模块:WebView、WebEngine都是这个模块的核心类,必须显式添加到--add-modules里,否则会导致类加载到未命名模块,引发跨模块访问权限问题。 - 导出完整的
com.sun.javafx.scene包:模块系统是按包导出权限的,不是单个类,所以不能只写ParentHelper,要导出整个包给未命名模块(ALL-UNNAMED),这样WebViewHelper就能正常访问ParentHelper了。
额外的小提示
你的代码里加载本地文件的路径C: /test/a.html在Linux系统下是无效的,Linux路径是/开头的,比如你可以改成/home/zahar/test/a.html(根据你的实际文件位置调整),否则点击对应按钮会抛出文件找不到的异常。
完成上述修改后,重新运行程序应该就能正常启动并使用WebView的功能了。
内容的提问来源于stack exchange,提问作者nehippi




