未使用IDE部署WildFly时javax.servlet.api依赖缺失问题咨询
问题:部署WAR到WildFly时出现HttpServletResponse NoClassDefFoundError(Undertow已启用)
环境信息
- WildFly版本:11.0.0.Final
- Java版本:OpenJDK 1.8.0_201
- 操作系统:Windows 10
问题详情
该WAR包(test_html.war)在Eclipse配置服务器运行时可正常部署,但手动部署到WildFly时失败,报错HttpServletResponse类未找到。服务器日志显示Undertow已正常启动:
2024-05-17 08:34:34,409 INFO [org.wildfly.extension.undertow] (MSC service thread 1-7) WFLYUT0003: Undertow 1.4.18.Final starting 2024-05-17 08:34:34,669 INFO [org.wildfly.extension.undertow] (MSC service thread 1-2) WFLYUT0012: Started server default-server. 2024-05-17 08:34:34,672 INFO [org.wildfly.extension.undertow] (MSC service thread 1-7) WFLYUT0018: Host default-host starting 2024-05-17 08:34:34,699 INFO [org.wildfly.extension.undertow] (MSC service thread 1-2) WFLYUT0006: Undertow HTTP listener default listening on 127.0.0.1:8080
但部署时抛出以下错误:
Caused by: java.lang.NoClassDefFoundError: HttpServletResponse at java.lang.Class.getDeclaredMethods0(Native Method) at java.lang.Class.privateGetDeclaredMethods(Class.java:2701) at java.lang.Class.getDeclaredMethods(Class.java:1975) at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:613) at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:524) at org.springframework.core.MethodIntrospector.selectMethods(MethodIntrospector.java:68) at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.detectHandlerMethods(AbstractHandlerMethodMapping.java:230) at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.initHandlerMethods(AbstractHandlerMethodMapping.java:214) at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.afterPropertiesSet(AbstractHandlerMethodMapping.java:184) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.afterPropertiesSet(RequestMappingHandlerMapping.java:127) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624) ... 39 more Caused by: java.lang.ClassNotFoundException: HttpServletResponse from [Module "deployment.test_html.war" from Service Module Loader] at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:198) at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:412) at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:400) at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:116) ... 51 more
已尝试在jboss-deployment-structure.xml中添加javax.servlet.api依赖,配置如下:
<?xml version="1.0" encoding="UTF-8"?> <jboss-deployment-structure> <deployment> <dependencies> <module name="javax.api"/> <module name="org.jboss.logging"/> <module name="javax.enterprise.api" optional="true"/> <module name="javax.ejb.api" optional="true"/> <module name="javax.persistence.api" optional="true"/> <module name="javax.security.auth.message.api" optional="true"/> <module name="javax.xml.bind.api"/> <module name="org.picketbox" optional="true"/> <module name="javax.servlet.api" /> <module name="javax.faces.api" optional="true"/> <module name="org.apache.commons" optional="true"/> <module name="org.jboss.resteasy.resteasy-jaxrs" optional="true"/> </dependencies> </deployment> </jboss-deployment-structure>
解决方案
核心原因
- WAR包自行打包了Servlet API依赖,与WildFly内置模块产生类加载冲突——WildFly默认通过Undertow提供Servlet API,应用若包含该依赖会打乱类加载优先级。
jboss-deployment-structure.xml位置错误,未被WildFly识别(需放在WAR的WEB-INF目录下)。- 服务器缓存残留导致类加载异常。
解决步骤
- 移除WAR包中的Servlet API依赖:检查WAR包的
WEB-INF/lib目录,删除servlet-api.jar、javax.servlet-api.jar等相关文件,依赖由服务器提供。 - 确认配置文件位置:确保
jboss-deployment-structure.xml放置在WAR包的WEB-INF目录下,否则WildFly不会读取该配置。 - 简化依赖配置:无需引入多余依赖,保留必要的Servlet API依赖即可:
<?xml version="1.0" encoding="UTF-8"?> <jboss-deployment-structure> <deployment> <dependencies> <module name="javax.servlet.api" /> </dependencies> </deployment> </jboss-deployment-structure>
- 清理服务器缓存:删除WildFly安装目录下
standalone/tmp和standalone/data的所有内容,重启服务器避免缓存干扰。 - 验证Undertow配置:检查
standalone/configuration/standalone.xml,确认<subsystem xmlns="urn:jboss:domain:undertow:3.1">节点存在且配置正常,确保Undertow子系统未被禁用。
内容的提问来源于stack exchange,提问作者NightEast
相关产品推荐
相关产品推荐

