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

Spring 6迁移后JSP页面抛出ClassNotFoundException: BodyTagSupport

解决Spring 6迁移后JSP页面的ClassNotFoundException问题

核心原因

Tomcat 10.1 基于 Jakarta EE 9+ 规范,所有 javax.servlet.* 相关包已迁移至 jakarta.servlet.* 命名空间。出现java.lang.ClassNotFoundException: javax.servlet.jsp.tagext.BodyTagSupport,说明项目中仍存在引用旧javax命名空间的代码、依赖或配置。

具体排查与修复步骤

  • 清理Struts残留声明
    检查项目中所有配置文件(如web.xml、struts.xml、Spring配置文件),删除所有Struts相关的过滤器、监听器、bean声明;同时检查Java类中是否有遗留的Struts注解、继承类(比如继承自Struts的Action类),这些残留代码大概率会引用旧的javax.servlet.jsp相关类。

  • 检查并替换依赖中的javax命名空间
    打开pom.xml,确保所有与Servlet、JSP相关的依赖都使用Jakarta版本:

    • 替换javax.servlet:javax.servlet-api为jakarta.servlet:jakarta.servlet-api(版本≥6.0)
    • 替换javax.servlet.jsp:javax.servlet.jsp-api为jakarta.servlet.jsp:jakarta.servlet.jsp-api(版本≥3.0)
    • 检查其他第三方依赖(如标签库、ORM框架),确保它们支持Jakarta EE 9+,避免引入仍依赖javax的旧版本依赖。
  • 验证JSP文件的taglib URI是否完全替换
    再次确认所有JSP中的taglib声明:

    • 例如JSTL标签库,旧URI是http://java.sun.com/jsp/jstl/core,需替换为http://xmlns.jcp.org/jsp/jstl/core
    • 自定义标签库的URI也需检查是否指向了基于Jakarta的版本,避免引用旧的标签类。
  • 检查编译与打包配置
    确保项目编译时使用Jakarta相关API,而非旧的javax API。如果使用Maven,可在pom.xml中添加编译参数:

    <build>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.11.0</version>
          <configuration>
            <source>17</source> <!-- Spring 6要求JDK≥17 -->
            <target>17</target>
            <compilerArgs>
              <arg>-parameters</arg>
            </compilerArgs>
          </configuration>
        </plugin>
      </plugins>
    </build>
    

    同时清理项目的target目录,重新打包部署,避免旧编译文件残留。

  • 检查Tomcat部署目录
    清理Tomcat的webapps目录下的旧项目文件,确保部署的是最新打包的war包,避免旧的class文件或jar包干扰。

内容的提问来源于stack exchange,提问作者Tan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 22:13:11