WildFly 27中升级EAR内置Hibernate至6.6.17失败求助
解决WildFly 27中通过EAR升级Hibernate至6.6.17但版本仍显示6.1.5的问题
1. 补全jboss-deployment-structure.xml的排除规则
WildFly自带的Hibernate关联模块不止核心的org.hibernate,需确保所有相关模块都被排除,且每个需要自定义Hibernate的子模块(WAR/EJB)都配置该文件。正确的WAR级配置示例:
<?xml version="1.0" encoding="UTF-8"?> <jboss-deployment-structure> <deployment> <exclude-subsystems> <subsystem name="jpa"/> </exclude-subsystems> <exclusions> <module name="org.hibernate" slot="main"/> <module name="org.hibernate.jpa.api"/> <module name="org.hibernate.validator"/> <module name="org.hibernate.commons-annotations"/> </exclusions> </deployment> </jboss-deployment-structure>
2. 排查EAR类加载优先级冲突
WildFly中EAR根目录lib下的Jar加载优先级高于WAR的WEB-INF/lib,如果EAR_ROOT/lib中存在旧版Hibernate Jar,会覆盖WAR中的新版本:
- 解压EAR包,检查
lib目录是否有hibernate-core-6.1.5.Final.jar等旧版文件,如有直接删除 - 执行
mvn dependency:tree排查依赖树,排除其他依赖间接引入的旧版Hibernate,确保pom.xml中仅保留6.6.17版本的依赖
3. 确保Hibernate依赖完整
Hibernate 6.6.17需要配套的依赖集,pom.xml中至少需包含核心及关联模块:
<dependencies> <dependency> <groupId>org.hibernate.orm</groupId> <artifactId>hibernate-core</artifactId> <version>6.6.17.Final</version> </dependency> <dependency> <groupId>org.hibernate.orm</groupId> <artifactId>hibernate-jpamodelgen</artifactId> <version>6.6.17.Final</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>8.0.1.Final</version> </dependency> </dependencies>
注意:Hibernate 6.6.x要求Java 11+,需确保WildFly运行环境及项目编译版本符合要求。
4. 全局配置EAR级别的模块隔离
若EAR包含多个子模块,需在EAR根目录添加jboss-deployment-structure.xml,全局隔离子模块类加载并排除旧版依赖:
<?xml version="1.0" encoding="UTF-8"?> <jboss-deployment-structure> <ear-subdeployments-isolated>true</ear-subdeployments-isolated> <sub-deployment name="your-war-module.war"> <exclude-subsystems> <subsystem name="jpa"/> </exclude-subsystems> <exclusions> <module name="org.hibernate"/> <module name="org.hibernate.jpa.api"/> <module name="org.hibernate.validator"/> </exclusions> </sub-deployment> <!-- 其他子模块如EJB需重复上述排除配置 --> </jboss-deployment-structure>
5. 验证类加载来源
添加调试代码确认org.hibernate.Version的加载路径,判断是否加载了目标版本Jar:
ClassLoader loader = org.hibernate.Version.class.getClassLoader(); URL classPath = loader.getResource("org/hibernate/Version.class"); System.out.println("Hibernate类加载路径:" + classPath);
若输出指向WildFly系统模块目录(如modules/system/layers/base/org/hibernate/main/...),说明排除规则未生效;若指向WAR的WEB-INF/lib/hibernate-core-6.6.17.Final.jar,则需清理缓存。
6. 清理WildFly缓存
WildFly的部署缓存可能保留旧版类文件,需:
- 停止WildFly服务
- 删除
standalone/data/content、standalone/tmp、standalone/work目录下所有内容 - 重启WildFly并重新部署EAR
内容的提问来源于stack exchange,提问作者user949550
相关产品推荐
相关产品推荐

