JFoenix的JFXTextField启动报错:java.base未开放java.lang.reflect给com.jfoenix
问题
我使用IntelliJ+Gradle搭配JavaFX开发,测试JFoenix组件库时,将JFXTextField通过SceneBuilder拖入场景后应用无法启动,但JFXButton等组件可正常运行。
已做尝试:
- 切换Java 11/17版本、SceneBuilder 15/17版本,问题未解决
- 添加JVM参数
--add-opens=java.base/java.lang.reflect=com.jfoenix,无效
我的module-info.java配置:
module test { requires javafx.controls; requires javafx.fxml; requires org.controlsfx.controls; requires org.kordamp.bootstrapfx.core; requires com.jfoenix; opens ... exports... }
核心报错信息:
java.lang.reflect.InaccessibleObjectException: Unable to make boolean java.lang.reflect.AccessibleObject.setAccessible0(boolean) accessible: module java.base does not "opens java.lang.reflect" to module com.jfoenix at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:340) ... Caused by: java.lang.NullPointerException at com.jfoenix/com.jfoenix.skins.JFXTextFieldSkin.updateTextPos(JFXTextFieldSkin.java:109)
Gradle构建失败提示:
FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':run'. > Process 'command 'C:\Program Files\Java\jdk-11.0.13\bin\java.exe'' finished with non-zero exit value 1
解决方案
1. 正确在Gradle中配置JVM参数
直接在run命令后追加参数通常无法被Gradle正确识别,需在构建脚本中明确配置运行时JVM参数:
Groovy DSL(build.gradle)
如果使用application插件:
application { mainClass.set("你的主类全限定名") applicationDefaultJvmArgs = [ "--add-opens=java.base/java.lang.reflect=com.jfoenix", "--add-opens=java.base/java.lang.reflect.AccessibleObject=com.jfoenix" ] }
如果使用JavaFX插件:
javafx { version = "你的JavaFX版本号" modules = [ 'javafx.controls', 'javafx.fxml' ] } tasks.withType(JavaExec) { jvmArgs += [ "--add-opens=java.base/java.lang.reflect=com.jfoenix", "--add-opens=java.base/java.lang.reflect.AccessibleObject=com.jfoenix" ] }
Kotlin DSL(build.gradle.kts)
application { mainClass.set("你的主类全限定名") applicationDefaultJvmArgs = listOf( "--add-opens=java.base/java.lang.reflect=com.jfoenix", "--add-opens=java.base/java.lang.reflect.AccessibleObject=com.jfoenix" ) } // 针对JavaFX插件的配置 tasks.withType<JavaExec> { jvmArgs.addAll( listOf( "--add-opens=java.base/java.lang.reflect=com.jfoenix", "--add-opens=java.base/java.lang.reflect.AccessibleObject=com.jfoenix" ) ) }
2. 验证版本兼容性
确保JFoenix版本与JavaFX版本匹配:
- JavaFX 11对应JFoenix 9.0.10及以上版本
- JavaFX 17可尝试JFoenix 9.0.11或最新快照版本(部分新版本仍可能存在反射依赖问题)
3. 临时替代方案(若参数配置无效)
如果上述配置后仍报错,可尝试:
- 移除
module-info.java,切换为非模块化运行模式,在Gradle中添加:// Groovy DSL modularity.inferModulePath = false// Kotlin DSL modularity.inferModulePath.set(false)
内容的提问来源于stack exchange,提问作者Enrico
相关产品推荐
相关产品推荐

