升级WildFly30+Java17时出现javax/transaction/SystemException类找不到错误
问题描述
- 运行环境:WildFly 30 + 最新版Spring + Hibernate Core 6.4.4.Final + Java 17
- 报错信息:部署服务器时抛出
java.lang.NoClassDefFoundError: javax/transaction/SystemException,项目无直接引入javax相关依赖 - 关键错误栈:
Caused by: java.lang.ExceptionInInitializerError: Exception java.lang.NoClassDefFoundError: javax/transaction/SystemException [in thread "ServerService Thread Pool -- 86"] at java.lang.Class.forName0(Native Method) ~[?:?] at java.lang.Class.forName(Class.java:467) ~[?:?] at org.jboss.logging.Logger.doGetMessageLogger(Logger.java:2562) ~[jboss-logging-3.5.0.Final.jar:3.5.0.Final] at org.jboss.logging.Logger.getMessageLogger(Logger.java:2530) ~[jboss-logging-3.5.0.Final.jar:3.5.0.Final] at org.jboss.logging.Logger.getMessageLogger(Logger.java:2516) ~[jboss-logging-3.5.0.Final.jar:3.5.0.Final] at org.hibernate.cache.ehcache.internal.EhCacheMessageLogger.<init>(EhCacheMessageLogger.java:31) ~[hibernate-ehcache-6.0.0.Alpha7.jar:6.0.0.Alpha7] at org.hibernate.cache.ehcache.internal.EhcacheRegionFactory.<init>(EhcacheRegionFactory.java:46) ~[hibernate-ehcache-6.0.0.Alpha7.jar:6.0.0.Alpha7] ... at org.springframework.orm.hibernate5.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:600) ~[spring-orm-6.1.4.jar:6.1.4]
解决方案
1. 替换过时的Hibernate Ehcache依赖
错误栈显示使用的hibernate-ehcache-6.0.0.Alpha7是老旧的测试版本,Hibernate 6+已弃用该模块,改用基于JCache标准的hibernate-jcache。需要移除旧依赖,添加适配的JCache实现(如Ehcache 3.x):
Maven配置示例:
<!-- 移除旧的hibernate-ehcache依赖 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-ehcache</artifactId> <version>6.0.0.Alpha7</version> </dependency> <!-- 添加新的JCache依赖 --> <dependency> <groupId>org.hibernate.orm</groupId> <artifactId>hibernate-jcache</artifactId> <version>6.4.4.Final</version> </dependency> <dependency> <groupId>org.ehcache</groupId> <artifactId>ehcache</artifactId> <version>3.10.8</version> </dependency>
2. 配置Hibernate使用JCache作为缓存提供者
在Hibernate配置文件(如hibernate.cfg.xml)或Spring配置中,指定JCache缓存工厂:
hibernate.cache.region.factory_class=org.hibernate.cache.jcache.JCacheRegionFactory hibernate.jcache.provider=org.ehcache.jsr107.EhcacheCachingProvider
3. 清理旧Java EE API依赖
WildFly 30基于Jakarta EE 10,所有javax.*包已迁移至jakarta.*。需确保依赖中无旧Java EE API:
- 检查间接依赖:使用Maven的
dependency:tree命令排查是否有依赖引入javax.transaction包,如有则排除:
<dependency> <groupId>org.hibernate.orm</groupId> <artifactId>hibernate-core</artifactId> <version>6.4.4.Final</version> <exclusions> <exclusion> <groupId>javax.transaction</groupId> <artifactId>javax.transaction-api</artifactId> </exclusion> </exclusions> </dependency>
4. 确认WildFly事务模块启用
在WildFly的standalone.xml或domain.xml中,确保事务子系统已正确配置:
<subsystem xmlns="urn:jboss:domain:transactions:8.0"> <core-environment> <process-id> <uuid/> </process-id> </core-environment> <recovery-environment socket-binding="txn-recovery-environment" status-socket-binding="txn-status-manager"/> <coordinator-environment default-timeout="300"/> </subsystem>
内容的提问来源于stack exchange,提问作者Poornima
相关产品推荐
相关产品推荐

