使用Java FX 19集成JFoenix日期选择器时Maven报错求解决方案
解决JavaFX 19集成JFoenix日期选择器的模块访问报错
报错原因
这个错误是因为JFoenix的JFXGenericPickerBehavior类依赖了JavaFX的内部非公开API——com.sun.javafx.scene.control.behavior.ComboBoxBaseBehavior。JavaFX 9+启用模块化系统(JPMS)后,默认不会将这类内部包导出给未命名模块(即没有声明module-info.java的项目),导致访问被拒绝。
解决方案
1. 未使用module-info.java(未命名模块)
在运行程序时添加VM参数,强制让javafx.controls模块将内部包导出给所有未命名模块:
--add-exports javafx.controls/com.sun.javafx.scene.control.behavior=ALL-UNNAMED --add-exports javafx.controls/com.sun.javafx.scene.control.inputmap=ALL-UNNAMED
如果是通过Maven的exec-maven-plugin运行项目,需要在pom.xml的插件配置中加入这些参数:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <goals> <goal>exec</goal> </goals> </execution> </executions> <configuration> <executable>java</executable> <arguments> <argument>--module-path</argument> <argument>${project.build.directory}/modules</argument> <!-- 添加导出权限参数 --> <argument>--add-exports</argument> <argument>javafx.controls/com.sun.javafx.scene.control.behavior=ALL-UNNAMED</argument> <argument>--add-exports</argument> <argument>javafx.controls/com.sun.javafx.scene.control.inputmap=ALL-UNNAMED</argument> <argument>-cp</argument> <argument>${project.build.dependencyClasspath}</argument> <argument>你的主类全限定名</argument> </arguments> </configuration> </plugin>
2. 使用module-info.java(模块化项目)
在module-info.java中声明对JavaFX内部包的访问权限,并确保依赖JFoenix模块:
module your.module.name { requires javafx.controls; requires jfoenix; // 声明依赖JFoenix // 允许JFoenix访问JavaFX的内部API opens com.sun.javafx.scene.control.behavior to jfoenix; opens com.sun.javafx.scene.control.inputmap to jfoenix; // 其他必要的模块声明 requires transitive javafx.graphics; exports your.package.name; // 导出你的主类所在包 }
注意:如果使用的JFoenix版本没有自带
module-info.java(非模块化构建),这种方法可能无效,建议改用第一种方案。
3. 替代方案:更换/升级依赖
- 尝试使用适配JavaFX 19的JFoenix最新版本,部分新版本已修复模块化兼容问题。
- 如果找不到合适的JFoenix版本,可替换为不依赖内部API的日期选择器库,比如ControlsFX的
DatePicker组件。
内容的提问来源于stack exchange,提问作者Dilshan Dekumpitiya
相关产品推荐
相关产品推荐

