将Struts 1迁移至Struts 2并升级Java 17时遇类找不到错误
解决方案:java.lang.NoClassDefFoundError: jakarta/servlet/ServletContextListener
这个错误的核心原因是类加载时无法找到Jakarta EE规范下的Servlet API类,结合你的环境(Tomcat 10.1.5 + Struts 2 6.x + Java 17),可以按以下步骤排查解决:
1. 确认项目的Target Runtime配置
- 在Eclipse中右键项目 → Properties → Targeted Runtimes
- 确保只选中
apache-tomcat-10.1.5,取消其他旧版本Tomcat(如Tomcat 9及以下,这类版本使用javax.servlet而非jakarta.servlet)的勾选 - 应用配置后重新编译项目
2. 排查并清理冲突依赖
Tomcat 10+完全基于Jakarta EE,任何引入javax.servlet相关的依赖都会导致类冲突,执行以下操作:
- 运行Maven命令查看依赖树:
mvn dependency:tree - 查找输出中所有
javax.servlet开头的依赖项,在对应的<dependency>标签中添加排除规则,示例:<dependency> <!-- 你的第三方依赖 --> <groupId>xxx</groupId> <artifactId>xxx</artifactId> <version>xxx</version> <exclusions> <exclusion> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> </exclusion> </exclusions> </dependency>
3. 修正web.xml的命名空间
Tomcat 10+要求web.xml使用Jakarta EE 6.0的命名空间,替换旧的Java EE命名空间:
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd" version="6.0"> <!-- 你的web配置内容 --> </web-app>
4. 清理缓存并重新部署
- 在Eclipse中执行Project → Clean,清理编译生成的class文件
- 删除Tomcat工作目录下的项目缓存:
apache-tomcat-10.1.5/work/Catalina/localhost/[你的项目名] - 重新启动Tomcat并部署项目
5. 验证依赖范围
你的jakarta.servlet-api和jakarta.servlet.jsp-api设置为<scope>provided</scope>是正确的,无需修改——Tomcat会提供这些API类,避免打包到WAR中引发冲突。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

