You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级JDK17与Gradle7.3.2后出现Injector.defineClass空指针异常求助

异常原因及解决办法

核心原因

  1. JDK17的强封装限制
    旧版com.sun.xml.bind(Oracle/Sun的JAXB实现)中的Injector类依赖反射调用JDK内部API来动态生成优化类,但JDK17的模块系统(JPMS)严格限制了对内部API的反射访问,导致defineClass方法获取失败,引用变为null,触发空指针异常。

  2. 依赖版本不兼容
    你添加的jaxb-runtime:3.0.2是Jakarta EE规范的实现(包名jakarta.xml.bind),但从栈信息看,你的Hibernate版本仍依赖传统JEE的javax.xml.bind API,两者包名完全不同,无法互相兼容。同时项目中可能还存在Hibernate传递引入的旧版com.sun.xml.bind依赖,这些旧版本无法适配JDK17的规则,被优先加载后引发初始化错误。

  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 18:05:37