升级至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,所以启动时会抛出类找不到的错误。
解决步骤
- 替换Waffle依赖:把内部公共库中的
waffle-jna换成Jakarta版本:
<dependency> <groupId>com.github.waffle</groupId> <artifactId>waffle-jna-jakarta</artifactId> <version>3.5.0</version> </dependency>
- 更新过滤器类与参数配置: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>
- 清理重建项目:执行
mvn clean install -U清理依赖缓存并重新编译公共库和Web应用,确保新依赖被正确引入。 - 重新部署验证:把更新后的应用部署到Tomcat10,确认过滤器正常启动。
额外注意
如果项目里还有其他依赖用到javax.servlet,需要同步检查是否有对应的Jakarta版本替代,避免混合依赖引发冲突。Tomcat10完全基于Jakarta Servlet 5.0规范,所有相关依赖必须适配这套新规范。
内容的提问来源于stack exchange,提问作者Zimeon
相关产品推荐
相关产品推荐

