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

升级至Java17+Tomcat10后Waffle3.5.0报javax.servlet/Filter类未找到错误

问题:升级Java17+Tomcat10后Waffle过滤器启动报错NoClassDefFoundError: javax/servlet/Filter

问题背景

  • 原环境:Java 11 Web应用
  • 升级目标:Java 17 + Tomcat 10
  • 已完成操作:将代码中所有javax.servlet替换为jakarta.servlet,调整相关方法,代码可正常编译
  • 核心报错:

SEVERE [Catalina-utility-2] org.apache.catalina.core.StandardContext.filterStart Exception starting filter [SecurityFilter]
java.lang.NoClassDefFoundError: javax/servlet/Filter
at java.base/java.lang.ClassLoader.defineClass1(Native Method)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1017)

相关配置

web.xml中的过滤器定义

<filter>
    <filter-name>SecurityFilter</filter-name>
    <filter-class>waffle.servlet.NegotiateSecurityFilter</filter-class>
    <init-param>
        <param-name>waffle.servlet.spi.NegotiateSecurityFilterProvider/protocols</param-name>
        <param-value>NTLM</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>SecurityFilter</filter-name>
    <url-pattern>/servlet/*</url-pattern>
</filter-mapping>

内部公共库的pom.xml依赖

<dependency>
    <groupId>com.github.waffle</groupId>
    <artifactId>waffle-jna</artifactId>
    <version>3.5.0</version>
</dependency>

问题根源

Waffle 3.x版本开始拆分了适配不同Servlet规范的分支:

  • waffle-jna适配传统javax.servlet(对应Tomcat9及以下、JavaEE环境)
  • 适配Jakarta Servlet(Tomcat10+、JakartaEE)的是专门的waffle-jna-jakarta构件

你当前用的waffle-jna 3.5.0依然依赖旧的javax.servlet API,而Tomcat10已经完全移除了这套API,所以启动时会抛出类找不到的错误。

解决步骤

  1. 替换Waffle依赖:把内部公共库中的waffle-jna换成Jakarta版本:
<dependency>
    <groupId>com.github.waffle</groupId>
    <artifactId>waffle-jna-jakarta</artifactId>
    <version>3.5.0</version>
</dependency>
  1. 更新过滤器类与参数配置:Jakarta版本的Waffle过滤器类路径和参数名都有变更,需要修改web.xml:
    • 过滤器类改为waffle.jakarta.servlet.NegotiateSecurityFilter
    • 初始化参数名改为waffle.jakarta.servlet.spi.NegotiateSecurityFilterProvider/protocols
      修改后的web.xml片段:
<filter>
    <filter-name>SecurityFilter</filter-name>
    <filter-class>waffle.jakarta.servlet.NegotiateSecurityFilter</filter-class>
    <init-param>
        <param-name>waffle.jakarta.servlet.spi.NegotiateSecurityFilterProvider/protocols</param-name>
        <param-value>NTLM</param-value>
    </init-param>
</filter>
  1. 清理重建项目:执行mvn clean install -U清理依赖缓存并重新编译公共库和Web应用,确保新依赖被正确引入。
  2. 重新部署验证:把更新后的应用部署到Tomcat10,确认过滤器正常启动。

额外注意

如果项目里还有其他依赖用到javax.servlet,需要同步检查是否有对应的Jakarta版本替代,避免混合依赖引发冲突。Tomcat10完全基于Jakarta Servlet 5.0规范,所有相关依赖必须适配这套新规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 06:17:02