升级JDK17与Gradle7.3.2后出现Injector.defineClass空指针异常求助
异常原因及解决办法
核心原因
JDK17的强封装限制
旧版com.sun.xml.bind(Oracle/Sun的JAXB实现)中的Injector类依赖反射调用JDK内部API来动态生成优化类,但JDK17的模块系统(JPMS)严格限制了对内部API的反射访问,导致defineClass方法获取失败,引用变为null,触发空指针异常。依赖版本不兼容
你添加的jaxb-runtime:3.0.2是Jakarta EE规范的实现(包名jakarta.xml.bind),但从栈信息看,你的Hibernate版本仍依赖传统JEE的javax.xml.bindAPI,两者包名完全不同,无法互相兼容。同时项目中可能还存在Hibernate传递引入的旧版com.sun.xml.bind依赖,这些旧版本无法适配JDK17的规则,被优先加载后引发初始化错误。Hibernate版本适配问题
如果你的Hibernate版本较旧,它的JAXB配置加载逻辑是针对JDK8/11设计的,没有适配JDK17的权限控制和模块变化。
解决步骤
- 改用兼容JDK17的javax版JAXB
放弃Jakarta版3.x,使用com.sun.xml.bind的2.x最新兼容版本,它保留javax.xml.bind包名,能适配旧版Hibernate:
implementation group: 'com.sun.xml.bind', name: 'jaxb-impl', version: '2.3.6' implementation group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.3' implementation group: 'javax.activation', name: 'activation', version: '1.1.1' // 部分场景需要
- 排除冲突的旧依赖
确保Hibernate传递引入的旧JAXB模块被排除,避免版本冲突:
configurations.all { exclude group: 'com.sun.xml.bind', module: 'jaxb-core' exclude group: 'com.sun.xml.bind', module: 'jaxb-impl' exclude group: 'javax.xml.bind', module: 'jaxb-api' }
- 临时绕过优化机制
通过系统属性强制JAXB关闭动态类优化,避免反射访问内部API:
在项目启动参数中添加:
-Dcom.sun.xml.bind.v2.runtime.reflect.opt.Injector.noOptimize=true
- 升级Hibernate到兼容版本
如果条件允许,升级Hibernate到5.6.x或6.x版本,这些版本已适配JDK17和Jakarta EE规范,能从根本上解决兼容性问题。
内容的提问来源于stack exchange,提问作者Praveen
相关产品推荐
相关产品推荐

