Caused by: java.lang.ClassNotFoundException: javax.transaction.SystemException
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
...
at org.hibernate.cfg.Configuration.<clinit>(Configuration.java:86)
Hibernate 5 啟動時靜態初始化 Configuration 類別,內部嘗試載入 JTA 相關類別,卻找不到 javax.transaction.SystemException。
Hibernate 5 核心模組 不再內建 JTA API (javax.transaction:jta),需專案自行引入。Maven 中央倉庫坐標:
<dependency>
<groupId>javax.transaction</groupId>
<artifactId>jta</artifactId>
<version>1.1</version> <!-- 或 1.2 -->
</dependency>
Gradle:implementation 'javax.transaction:jta:1.1'
org.hibernate.internal.CoreLogging.messageLogger 使用 JBoss Logging,後者在靜態區塊嘗試偵測 JTA 環境以啟用分散式事務支援,觸發 Class.forName("javax.transaction.SystemException"),找不到即拋出 NoClassDefFoundError。
pom.xml / build.gradle 加入上述依賴。mvn clean compile 或 gradle clean build 刷新依賴。Spring 的 LocalSessionFactoryBean 會自動引入 spring-tx,後者傳遞依賴 javax.transaction:jta,通常不會缺包。純 Hibernate + JUnit 環境最容易遺漏。
缺 jta.jar 是 Hibernate 5 常見坑,加入 javax.transaction:jta:1.1 即可解決。建議在專案模板/父 POM 中預設加入,避免新模組踩坑。