Wildfly 27(Jakarta EE10)迁移启动失败:找不到javax.servlet.Filter
排查Wildfly 27(Jakarta EE 10)启动NoClassDefFoundError问题
核心问题分析
Wildfly 27基于Jakarta EE 10,容器已完全移除javax.*命名空间的API,仅提供jakarta.*版本。出现javax/servlet/Filter找不到的错误,说明项目中仍有代码或依赖在引用旧的javax类——哪怕你已经替换了自有代码,也可能存在隐藏的残留问题。
具体排查步骤
1. 修正web.xml的schema版本
你提到更新到Jakarta EE 6.0 schema,这是错误的。Jakarta EE 10对应的web.xml schema应为4.0版本(对应Servlet 6.0),旧schema会导致容器以兼容模式处理,仍尝试加载javax类。正确的web.xml头如下:
<?xml version="1.0" encoding="UTF-8"?> <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_4_0.xsd" version="4.0">
2. 排查依赖中的javax残留
- 运行
mvn dependency:tree,搜索所有包含javax.servlet、javax.*的依赖,确认是否有第三方库仍在使用旧API。 - 对于必须保留的第三方依赖,检查是否有对应的Jakarta兼容版本(通常groupId从
javax.*改为jakarta.*,artifactId可能不变或调整)。 - 确保所有Servlet/Filter相关依赖的scope设为
provided,因为Wildfly 27已内置Jakarta EE 10的API,无需打包到war中。示例:
<dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>6.0.0</version> <scope>provided</scope> </dependency>
3. 检查编译后的类文件
- 解压war包,找到
com.oberon.esg.server.SessionTimeoutCookieFilter类,用反编译工具(如JD-GUI)查看其import语句,确认是否仍引用javax.servlet.Filter而非jakarta.servlet.Filter。 - 若存在旧import,说明代码替换不彻底(比如漏改文件、IDE缓存未清理),需重新检查所有Filter、Servlet、Listener类的import。
4. 检查容器配置与模块
- 若项目使用自定义Wildfly模块,检查是否仍依赖
javax.servlet.api模块,需替换为jakarta.servlet.api。 - 若存在
jboss-deployment-structure.xml,确保没有引入旧的javax相关模块。
5. 清理构建缓存
- 执行
mvn clean install,彻底清理旧的编译产物,避免残留的javax类文件被打包到war中。 - 清理IDE缓存(如IntelliJ的
File -> Invalidate Caches/Restart),确保编译时使用最新的依赖和代码。
额外注意点
- Jakarta EE 10不仅是命名空间替换,部分API有行为变更,替换后若仍有问题,需检查Filter/Servlet的初始化逻辑是否符合Servlet 6.0规范。
- 若使用Spring等框架,需确保框架版本支持Jakarta EE 10(如Spring Boot 3.x、Spring Framework 6.x),旧版本框架会依赖javax API导致冲突。
内容的提问来源于stack exchange,提问作者Flowertown Technology
相关产品推荐
相关产品推荐

