Open Liberty Jakarta EE10部署报错:InaccessibleObjectException
问题原因
Java 17 的模块系统(JPMS)严格限制了核心模块内部 API 的反射访问权限。Open Liberty 的 CDI 代理生成逻辑尝试通过反射调用 java.lang.ClassLoader.defineClass 方法,但 java.base 模块并未将 java.lang 包开放给未命名模块(unnamed module),导致权限拒绝错误,最终无法为 UserTransaction 内置 Bean 创建代理类。
解决方法
方法1:添加JVM启动参数
在 Open Liberty 的启动脚本中添加以下 JVM 参数,允许未命名模块访问 java.lang 包的反射权限:
--add-opens java.base/java.lang=ALL-UNNAMED
如果仍存在相关反射错误,可补充添加:
--add-opens java.base/java.lang.reflect=ALL-UNNAMED
方法2:升级Open Liberty版本
该问题属于特定版本的兼容性问题,建议升级到 Open Liberty 的最新稳定版本(如 24.0.0.12 及以上),官方大概率已修复 JPMS 环境下的反射访问权限问题。
方法3:清理server.xml冗余配置
你的 server.xml 中同时声明了 jakartaee-10.0 核心特性和多个单独的 Jakarta EE 子特性(如 cdi-4.0、servlet-6.0)。虽然 Liberty 会自动处理依赖冲突,但建议移除单独的子特性声明,仅保留核心特性以简化配置:
<featureManager> <feature>localConnector-1.0</feature> <feature>mpHealth-2.2</feature> <feature>jakartaee-10.0</feature> </featureManager>
(注意:保留 localConnector-1.0、mpHealth-2.2 等非 Jakarta EE 核心特性)
内容的提问来源于stack exchange,提问作者Rémi
相关产品推荐
相关产品推荐

