JDK11+ControlsFX11.0.0使用TextFields.bindAutoCompletion遇非法访问错误求助
问题分析与解决方案
当前配置的问题
你添加的--add-exports javafx.base/com.sun.javafx.event=ALL-UNNAMED配置不正确,原因是ControlsFX 11是命名模块(模块名org.controlsfx.controls),而ALL-UNNAMED指代未模块化的代码,这条导出规则无法作用于命名模块,所以异常仍然存在。
正确的解决步骤
修改VM参数的导出目标
将javafx-maven-plugin中的--add-exports参数目标改为ControlsFX的模块名,同时ControlsFX 11还需要访问JavaFX的其他内部API,建议一并添加以下参数:<plugin> <groupId>org.openjfx</groupId> <artifactId>javafx-maven-plugin</artifactId> <version>0.0.8</version> <configuration> <mainClass>hu.infokristaly.jpasswordprotector.Main</mainClass> <options> <option>--add-exports javafx.base/com.sun.javafx.event=org.controlsfx.controls</option> <option>--add-exports javafx.controls/com.sun.javafx.scene.control.behavior=org.controlsfx.controls</option> <option>--add-exports javafx.controls/com.sun.javafx.scene.control=org.controlsfx.controls</option> </options> </configuration> </plugin>确认module-info.java配置
你的module-info.java配置是正确的,已经通过requires org.controlsfx.controls声明了对ControlsFX模块的依赖,无需修改。
原理说明
Java 9引入的模块系统默认隐藏com.sun开头的内部API,只有通过--add-exports参数明确指定将内部包导出给特定的命名模块,该模块才能访问这些API。ControlsFX作为命名模块,必须直接指定其模块名作为导出目标,而非ALL-UNNAMED。
内容的提问来源于stack exchange,提问作者Papp Zoltán
相关产品推荐
相关产品推荐

