You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 00:32:40