升级Hibernate Reactive至2.0.0.Final后遇NoClassDefFoundError求助
解决Hibernate Reactive 2.0.0.Final的NoClassDefFoundError问题
问题根源
你遇到的NoClassDefFoundError: org.hibernate.engine.spi.ComparableExecutable主要来自两个核心问题:
- 手动指定的
hibernate-core版本与hibernate-reactive-core2.0.0.Final不兼容,两者版本必须严格绑定匹配 - 配置中使用了JDBC风格属性,但Hibernate Reactive依赖Vertx反应式客户端,不支持JDBC相关配置项
修复步骤
1. 修正依赖配置
移除手动添加的hibernate-core和org.postgresql依赖——hibernate-reactive-core已经包含了适配的Hibernate Core传递依赖,且Vertx PG客户端自带PostgreSQL支持,无需额外引入JDBC驱动:
// rds reactive db implementation 'org.hibernate.reactive:hibernate-reactive-core:2.0.0.Final' implementation 'com.ongres.scram:client:2.1' implementation 'org.hibernate.validator:hibernate-validator:7.0.2.Final' implementation 'io.smallrye.reactive:mutiny-reactor:2.2.0' implementation 'io.vertx:vertx-pg-client:4.4.2' implementation 'org.glassfish:jakarta.el:4.0.2'
2. 调整Hibernate配置属性
将JDBC风格的配置替换为Hibernate Reactive专用属性:
public Map<String, String> hibernateProperties() { var connectionUrl = rdsProperties.getConnectionUrl(); var isNotProd = !activeProfile.equals("prod"); return Map.of( "hibernate.reactive.url", connectionUrl, "hibernate.reactive.username", rdsProperties.getUsername(), "hibernate.reactive.password", rdsProperties.getPassword(), "jakarta.persistence.schema-generation.database.action", rdsProperties.getDdlAuto(), "hibernate.show_sql", "false", "hibernate.default_schema", rdsProperties.getSchema() ); }
3. 验证依赖一致性
执行依赖树检查命令(以Gradle为例),确保没有冲突的Hibernate Core版本:
./gradlew dependencies | grep hibernate-core
确认输出的版本是与hibernate-reactive-core 2.0.0.Final对应的6.3.x系列版本(Hibernate Reactive 2.x基于Hibernate ORM 6.3)。
额外说明
Hibernate Reactive 2.x系列完全基于Jakarta Persistence 3.1和Hibernate ORM 6.3,不能与旧版本Hibernate Core混用,否则必然出现类缺失或兼容性问题。
内容的提问来源于stack exchange,提问作者Dmytro Kostyushko
相关产品推荐
相关产品推荐

