Jboss 7.4部署War包失败报Filter未实现javax.servlet.Filter错误如何解决
JBoss 6.4 迁移至 7.4 Filter/Servlet 部署报错解决方案
报错现象
将未修改的JBoss 6.4环境下的WAR包直接部署到JBoss 7.4时,web.xml中配置的所有Filter、Servlet类都会触发如下报错:
Caused by: java.lang.IllegalArgumentException: UT010011: Filter log4jServletFilter of type class org.apache.logging.log4j.web.Log4jServletFilter does not implement javax.servlet.Filter at io.undertow.servlet.api.FilterInfo.<init>(FilterInfo.java:74) at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService.createServletConfig(UndertowDeploymentInfoService.java:801) at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService.start(UndertowDeploymentInfoService.java:276) at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1739) at org.jboss.msc.service.ServiceControllerImpl$StartTask.execute(ServiceControllerImpl.java:1701) ... 6 more
若在jboss-deployment-structure.xml中添加如下配置排除undertow子系统,WAR包虽然可以无报错部署、控制台显示状态为活跃,但所有Web路径均无法访问:
<exclude-subsystems> <subsystem name="undertow" /> </exclude-subsystems>
问题根因
- JBoss 7.4默认使用Servlet API 4.0+,而WAR包中自带的旧版本log4j-web、Servlet API依赖和容器提供的API出现类加载冲突:容器提供的
javax.servlet.Filter接口和WAR包内自带的同名接口被不同类加载器加载,JVM会判定二者不匹配,因此报出Filter未实现接口的错误。 - undertow是JBoss 7系列的Web容器核心组件,排除该子系统后Web服务不会启动,自然无法处理任何Web请求,所以之前的规避操作是无效的。
修复方案
- 清理WAR包内冗余的Servlet API依赖
检查项目构建配置,将servlet-api、jsp-api这类容器会统一提供的依赖的scope设置为provided,禁止打包进WAR包的WEB-INF/lib目录下。Maven项目配置示例:<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> - 升级兼容版本的日志依赖
报错中提到的Log4jServletFilter来自旧版本的log4j-web组件,需将log4j2版本升级到2.17.1及以上,该版本已经兼容Servlet 4.0 API。 - 调整类加载优先级配置
在WEB-INF下新增/修改jboss-deployment-structure.xml,添加如下配置,优先加载JBoss容器提供的javax.servlet相关类,避免类冲突,同时删除之前的undertow子系统排除配置:<?xml version="1.0" encoding="UTF-8"?> <jboss-deployment-structure> <deployment> <exclusions> <module name="javax.servlet.api" /> </exclusions> <dependencies> <module name="javax.servlet.api" export="true" /> </dependencies> </deployment> </jboss-deployment-structure> - 重新打包部署
清理旧构建产物,重新打包WAR包后部署即可正常启动,Web路径也可以正常访问。
内容的提问来源于stack exchange,提问作者Lalit Kale
相关产品推荐
相关产品推荐

