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

Java8升级至Java17遭遇Javassist Enhancement失败问题求助

问题原因

你的问题核心是旧版本Hibernate和Javassist完全不兼容Java 17的模块系统(JPMS):

  • Hibernate 3.6.10.Final是2012年的版本,发布时Java 8都未推出,完全没有适配Java 9+的模块访问限制。
  • Javassist 3.17.1-GA同样是老旧版本,它依赖的反射操作在Java 17中被JPMS拦截,无法访问java.lang.ClassLoader的内部方法,从而抛出InaccessibleObjectException。
  • 你添加的JVM参数无效,一是参数路径错误(应为java.base/java.lang而非java.base/java.lang.module),二是仅配置了test任务,而错误发生在主程序运行阶段。
解决方案

1. 强制升级Hibernate和Javassist到兼容Java 17的版本

这是最根本的解决办法,旧版本Hibernate在Java 17下无法长期稳定工作,没有可靠的绕过方案。

推荐的Gradle依赖配置(替换旧依赖)

// Hibernate 5.6.x是支持Java 8-17的稳定版本,API变化相对小,适合从3.x过渡
implementation(group: 'org.hibernate', name: 'hibernate-core', version: '5.6.15.Final')
implementation(group: 'org.hibernate', name: 'hibernate-c3p0', version: '5.6.15.Final')
// 无需单独指定Javassist,Hibernate 5.6.x会自动引入兼容的版本(3.29.0-GA+)

如果想直接升级到最新的Hibernate 6.x(支持Java 11+),依赖配置如下:

implementation(group: 'org.hibernate', name: 'hibernate-core', version: '6.4.4.Final')
implementation(group: 'org.hibernate', name: 'hibernate-c3p0', version: '6.4.4.Final')

2. 调整JVM参数(升级后仍有遗留问题时使用)

如果升级依赖后仍存在反射访问问题,需要给主程序运行任务添加正确的JVM参数(不要仅配置test任务):

// 若使用Gradle Application插件
run {
    jvmArgs = [
        '--add-opens=java.base/java.lang=ALL-UNNAMED',
        '--add-opens=java.base/java.lang.reflect=ALL-UNNAMED'
    ]
}

// 若为Spring Boot项目
bootRun {
    jvmArgs = [
        '--add-opens=java.base/java.lang=ALL-UNNAMED',
        '--add-opens=java.base/java.lang.reflect=ALL-UNNAMED'
    ]
}

3. 代码的必要适配

升级Hibernate版本后,需要做少量调整:

  • SessionFactory创建:Hibernate 5.x中Configuration.buildSessionFactory()已被废弃,推荐使用新方式:
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;

// 替代旧的buildSessionFactory()方法
Configuration cfg = new Configuration().configure();
StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
        .applySettings(cfg.getProperties())
        .build();
SessionFactory sessionFactory = cfg.buildSessionFactory(registry);
  • 配置文件调整:检查hibernate.cfg.xml中的属性,部分旧属性已被废弃(如hibernate.connection.autocommit替换为hibernate.connection.provider_disables_autocommit),但基础的数据库连接、方言等配置无需修改。
  • 实体类:旧的JPA注解(@Entity、@Id、@Column等)完全兼容,Hibernate特有注解如@Fetch也能正常使用,无需大规模修改。
总结
  • 必须升级Hibernate和Javassist到兼容Java 17的版本,这是解决问题的核心。
  • 调整JVM参数是辅助手段,仅在升级后仍有反射问题时使用。
  • 代码修改量很小,主要集中在SessionFactory的创建方式和少量配置调整。

内容的提问来源于stack exchange,提问作者Anup

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 04:24:59