Spring项目添加REST API后AppInitializer依赖报错,求POM解决方法
问题分析与解决方案
核心问题
你的POM存在版本不兼容+API包冲突:
- Spring组件版本分裂:
spring-context、spring-web用了6.0.9(依赖Jakarta EE栈),但spring-webmvc用了5.3.4(依赖Java EE栈),两个版本依赖的Servlet API完全不同(Spring 6用jakarta.servlet.*,Spring 5用javax.servlet.*),导致类加载时找不到jakarta.servlet相关类。 - 同时引入
javax.servlet-api和jakarta.servlet-api,两种API包共存引发类路径混乱。 - Hibernate 5.x依赖Java EE的JPA API,和Spring 6的Jakarta JPA不兼容。
修正方案
1. 统一Spring版本,切换到完整的Spring 6栈
将所有Spring组件版本统一为6.0.9,Spring 6要求Java 17+,你的Java 18符合要求。
2. 替换所有javax依赖为Jakarta版本
Servlet、JSP、JSTL都要换成Jakarta EE对应的包,移除旧的javax依赖。
3. 升级Hibernate到兼容Jakarta的版本
Hibernate 6.x支持Jakarta EE,替换原有的Hibernate 5.x依赖。
修正后的POM配置
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>templateGestionale</groupId> <artifactId>templateGestionale</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <!-- 统一版本管理 --> <properties> <spring.version>6.0.9</spring.version> <hibernate.version>6.2.2.Final</hibernate.version> <jakarta.servlet.version>6.0.0</jakarta.servlet.version> <java.version>18</java.version> </properties> <dependencies> <!-- Spring 6 核心组件 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <!-- Spring ORM(整合Hibernate) --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> </dependency> <!-- MySQL驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.24</version> </dependency> <!-- Oracle驱动 --> <dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc8</artifactId> <version>18.3.0.0</version> </dependency> <!-- Hibernate 6(兼容Jakarta EE) --> <dependency> <groupId>org.hibernate.orm</groupId> <artifactId>hibernate-core</artifactId> <version>${hibernate.version}</version> </dependency> <!-- Jakarta Servlet API --> <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>${jakarta.servlet.version}</version> <scope>provided</scope> </dependency> <!-- Jakarta JSP API --> <dependency> <groupId>jakarta.servlet.jsp</groupId> <artifactId>jakarta.servlet.jsp-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <!-- Jakarta JSTL --> <dependency> <groupId>org.glassfish.web</groupId> <artifactId>jakarta.servlet.jsp.jstl</artifactId> <version>2.0.0</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.3.1</version> <configuration> <failOnMissingWebXml>false</failOnMissingWebXml> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <!-- 升级插件支持Java 18 --> <configuration> <source>${java.version}</source> <target>${java.version}</target> </configuration> </plugin> </plugins> </build> </project>
代码调整说明
你的AppInitializer和WebAppConfig代码无需修改,修正POM后,Spring 6版本会自动使用Jakarta Servlet API,类找不到的问题会消失。
额外注意事项
- 确保Web容器版本支持Jakarta EE 9+:Tomcat 10+支持Jakarta EE 9,Tomcat 9及以下仅支持Java EE(javax),如果使用Tomcat 9,建议降级到Spring 5.x全栈。
- 若坚持用Spring 5.x,需将所有Spring组件版本统一为5.3.x,移除jakarta依赖、保留javax版本,同时Java版本降至16及以下。
内容的提问来源于stack exchange,提问作者DDC
相关产品推荐
相关产品推荐

