TomEE从8.0.13升级到9.0.0后Spring应用启动失败求助
问题原因及解决方案
核心原因
TomEE 9基于Jakarta EE 9规范,所有Java EE相关API的包名已从javax.*全面迁移到jakarta.*,你的Spring应用仍依赖旧的javax.servlet.jsp.tagext.TryCatchFinally类,而TomEE 9中已不存在该类,因此抛出NoClassDefFoundError。
解决步骤
1. 升级Spring框架版本
Spring 5.3及以上版本开始支持Jakarta EE规范,请将Spring核心、Web等相关依赖升级至5.3.x及以上稳定版(推荐5.3.20+或更高)。例如:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.24</version> </dependency>
2. 替换所有javax相关API依赖为jakarta版本
将pom.xml中所有javax.*的Servlet/JSP/JSTL依赖,替换为对应的jakarta.*版本:
- Servlet API:
<!-- 旧依赖 --> <!-- <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> --> <!-- 新依赖 --> <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>5.0.0</version> <scope>provided</scope> </dependency> - JSP API:
<!-- 旧依赖 --> <!-- <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.3.3</version> <scope>provided</scope> </dependency> --> <!-- 新依赖 --> <dependency> <groupId>jakarta.servlet.jsp</groupId> <artifactId>jakarta.servlet.jsp-api</artifactId> <version>3.0.0</version> <scope>provided</scope> </dependency> - JSTL依赖:
<!-- 旧依赖 --> <!-- <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> --> <!-- 新依赖 --> <dependency> <groupId>jakarta.servlet.jsp.jstl</groupId> <artifactId>jakarta.servlet.jsp.jstl-api</artifactId> <version>2.0.0</version> </dependency> <dependency> <groupId>org.glassfish.web</groupId> <artifactId>jakarta.servlet.jsp.jstl</artifactId> <version>2.0.0</version> </dependency>
3. 检查其他第三方框架依赖
确保项目中使用的其他框架(如Spring Security、MyBatis等)版本支持Jakarta EE,避免存在依赖javax.*包的情况。
4. 重新构建部署
清理本地Maven缓存(执行mvn clean install -U),重新生成WAR包后部署到TomEE 9。
内容的提问来源于stack exchange,提问作者kafka services
相关产品推荐
相关产品推荐

