非Spring Boot的Spring Web项目依赖配置报错求助
问题排查与解决方案
核心问题:依赖版本不兼容
你遇到的java.lang.ClassNotFoundException: jakarta.transaction.SystemException本质是Spring 6+(Jakarta EE规范)与Hibernate 5.x(Javax规范)的API不兼容,加上依赖重复、版本过旧导致的类缺失。
具体问题点与修复步骤
Hibernate版本过低,不支持Jakarta EE
Hibernate 5.x基于javax.*包,而Spring 6、Spring Data JPA 3.x要求依赖jakarta.*规范的库。必须升级Hibernate到6.x版本(完全支持Jakarta EE 9+)。- 删除
hibernate-entitymanager依赖:Hibernate 5.2之后该模块已合并到hibernate-core中,无需单独引入。 - 更新
hibernate-core到兼容版本,比如6.4.4.Final。
- 删除
Jakarta Transaction API版本不匹配
当前jakarta.transaction-api:1.3.3是基于Javax的旧版本,需升级到Jakarta规范的2.0.1版本(与Spring 6、Hibernate 6兼容)。重复的Servlet API依赖
同时引入了jakarta.servlet-api:6.1.0和tomcat-servlet-api:10.0.0-M4,后者是里程碑版本且属于重复依赖,直接删除tomcat-servlet-api。Lombok版本过旧
lombok:1.16.22不支持Java 17和Jakarta规范,升级到稳定版如1.18.34。
修正后的pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.project</groupId> <artifactId>assignment</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!-- 统一管理依赖版本,避免冲突 --> <hibernate.version>6.4.4.Final</hibernate.version> <jakarta.transaction.version>2.0.1</jakarta.transaction.version> <lombok.version>1.18.34</lombok.version> </properties> <dependencies> <!-- Hibernate核心(已包含EntityManager功能) --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>${hibernate.version}</version> </dependency> <!-- MySQL驱动 --> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <version>8.3.0</version> </dependency> <!-- Jakarta Persistence API --> <dependency> <groupId>jakarta.persistence</groupId> <artifactId>jakarta.persistence-api</artifactId> <version>3.2.0</version> </dependency> <!-- Jakarta Servlet API --> <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>6.1.0</version> <scope>provided</scope> </dependency> <!-- Jakarta Annotation API --> <dependency> <groupId>jakarta.annotation</groupId> <artifactId>jakarta.annotation-api</artifactId> <version>3.0.0</version> </dependency> <!-- Jakarta Transaction API --> <dependency> <groupId>jakarta.transaction</groupId> <artifactId>jakarta.transaction-api</artifactId> <version>${jakarta.transaction.version}</version> </dependency> <!-- Log4j2核心 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.17.1</version> </dependency> <!-- Lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> <scope>provided</scope> </dependency> <!-- Spring Context --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>6.1.14</version> </dependency> <!-- Spring Data JPA --> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> <version>3.4.2</version> </dependency> <!-- Spring ORM --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>6.1.14</version> </dependency> <!-- Spring Web --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>6.1.14</version> </dependency> <!-- Spring Security --> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-core</artifactId> <version>6.3.6</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-web</artifactId> <version>6.3.6</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-config</artifactId> <version>6.3.6</version> </dependency> </dependencies> </project>
额外注意事项
- 确保你的Hibernate配置文件(如
hibernate.cfg.xml或Spring中的JPA配置)使用jakarta.persistence.*包路径,而非旧的javax.persistence.*。 - 启动前执行
mvn clean install清理旧依赖,避免缓存冲突。
学习途径推荐
- Spring官方文档:重点看Spring ORM、Spring Data JPA的独立使用章节,了解无Spring Boot时的配置方式。
- Hibernate官方文档:学习Hibernate 6的Jakarta EE适配细节,掌握核心配置与API变化。
- Java EE/Jakarta EE基础教程:理解Javax到Jakarta的迁移差异,避免API混淆。
- 实战项目:从零搭建简单的Spring Web + Hibernate应用,逐步掌握依赖管理与配置流程。
内容的提问来源于stack exchange,提问作者Fibin Frajo
相关产品推荐
相关产品推荐

