OpenJDK17环境运行Java容器抛出InaccessibleObjectException异常求助
异常成因
Java 9引入的JPMS(Java平台模块系统)收紧了对内部API的反射访问权限,你当前使用的Weld 3.1.0版本发布时间早于OpenJDK 17,未适配高版本JDK的模块访问规则:Weld启动过程中需要通过反射调用java.lang.ClassLoader的非公开方法defineClass来动态生成类,而OpenJDK 17默认禁止类路径下的未命名模块反射访问java.base模块的java.lang包非公开成员,因此直接抛出InaccessibleObjectException。
解决方案
- 【推荐方案】升级Weld到兼容OpenJDK 17的版本
升级Weld到3.1.9及以上的3.x稳定版,或者4.x、5.x的正式版本,高版本Weld已经原生适配了JPMS的访问限制,无需额外配置即可正常启动。 - 【临时兼容方案】添加JVM启动参数开放权限
如果暂时无法升级依赖,可以在启动Java程序时添加如下JVM参数,手动开放对应包的反射访问权限:
--add-opens java.base/java.lang=ALL-UNNAMED
如果后续运行仍触发其他模块的访问报错,可以对应补充其他--add-opens配置即可。
- 【模块化项目适配】如果你的项目本身使用了JPMS模块化开发(存在
module-info.java文件),可以直接在模块描述文件中添加对应的开放声明与Weld依赖声明即可。
内容的提问来源于stack exchange,提问作者Raphael Giusti
相关产品推荐
相关产品推荐

