在WildFly 26中加载Jar内Servlet过滤器时出现NoClassDefFoundError
问题分析与解决
问题根源
你看到的NoClassDefFoundError并不是找不到你的LoggingFilter类,而是**LoggingFilter加载时无法找到它依赖的jakarta.servlet.Filter接口**。这是因为WildFly的WAR类加载器未正确关联到Jakarta Servlet API模块,或者你的Filter项目依赖配置存在问题。
解决方法
1. 修正Filter项目的依赖范围
确保你的servlet-logging-filter项目中,Jakarta Servlet API依赖的范围设置为provided(由服务器提供该依赖,无需打包到jar中):
以Maven为例,修改pom.xml:
<dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>5.0.0</version> <!-- WildFly 26对应Servlet API 5.0版本 --> <scope>provided</scope> </dependency>
重新打包servlet-logging-filter-1.0.0.jar,替换WAR包WEB-INF/lib下的旧jar文件。
2. 显式声明WildFly模块依赖
如果步骤1无法解决问题,在你的WAR包的WEB-INF目录下创建jboss-deployment-structure.xml文件,强制引入Jakarta Servlet API模块:
<?xml version="1.0" encoding="UTF-8"?> <jboss-deployment-structure> <deployment> <dependencies> <!-- 引入WildFly内置的Jakarta Servlet API模块 --> <module name="jakarta.servlet.api" export="true"/> </dependencies> </deployment> </jboss-deployment-structure>
重新打包WAR和EAR后,再部署到WildFly。
3. 验证兼容性
确认你使用的WildFly 26是Jakarta EE 9.1兼容版本(默认即为该版本),它提供的Jakarta Servlet 5.0 API与你的Filter依赖的jakarta.servlet.Filter完全匹配。
额外检查项
- 确认
servlet-logging-filter-1.0.0.jar中未包含jakarta.servlet.*相关类,避免与服务器提供的API冲突。 - 确认WAR包的
WEB-INF/lib目录下仅存在你的Filter jar,无其他Servlet API相关的jar文件。
内容的提问来源于stack exchange,提问作者user1938742
相关产品推荐
相关产品推荐

