NetBeans17+GlassFish7部署JSF项目遇InaccessibleObjectException错误求助
问题分析与解决方案
问题根源
这个InaccessibleObjectException是JDK 9+模块化系统的强封装机制导致的:JDK17默认禁止未命名模块(即传统classpath下的代码)通过反射访问java.base模块中java.util.TreeMap的私有comparator字段。大概率是项目依赖的某个库(或GlassFish内部旧组件)仍在使用这种不兼容模块化的反射操作。
解决步骤
1. 给GlassFish添加JVM授权参数
直接修改GlassFish的全局JVM配置,开放java.util包给未命名模块:
- 找到GlassFish安装目录下的
glassfish/domains/domain1/config/domain.xml - 找到
<java-config>标签,在现有<jvm-options>列表中添加:<jvm-options>--add-opens java.base/java.util=ALL-UNNAMED</jvm-options> - 重启GlassFish后再运行项目
2. 排查并修复依赖冲突
执行Maven命令查看项目依赖树:
mvn dependency:tree
- 检查是否引入了旧版本的JSF/CDI依赖(比如Mojarra版本低于4.0.x),GlassFish7自带适配JDK17的Mojarra 4.0,若手动引入旧版本会导致冲突,需排除或升级。
- 检查是否有依赖使用了过时的反射工具库(比如旧版
commons-beanutils、commons-collections),这类库常访问JDK内部API,需替换为适配JDK17的版本。
3. 确认JDK配置一致性
- 确保NetBeans项目的运行环境完全指向JDK17:在项目属性→库→Java平台,选择JDK17;项目属性→运行→Java平台,同样选择JDK17。
- 验证GlassFish的JDK配置:查看GlassFish安装目录下
glassfish/config/asenv.bat(Windows)或asenv.conf(Linux/macOS),确认AS_JAVA指向JDK17的安装路径,避免混用JDK20。
4. 清理并重新构建项目
- 除了删除本地Maven仓库,还需清理NetBeans的项目缓存:右键项目→清理并构建,同时删除项目目录下的
target文件夹。
内容的提问来源于stack exchange,提问作者aapt
相关产品推荐
相关产品推荐

