使用Docker将War包从Nexus部署到Wildfly时遇部署错误
问题描述
尝试通过Docker将Nexus中的.war文件部署到Wildfly时出现部署失败错误,错误日志如下:
10:13:56,319 ERROR [org.jboss.as.controller.management-operation] (Controller Boot Thread) WFLYCTL0013: Operation ("deploy") failed - address: ([("deployment" => "file.war")]) - failure description: {"WFLYCTL0080: Failed services" => {"jboss.deployment.unit.\"file.war\".component.\"javax.servlet.http.HttpServlet$NoBodyAsyncContextListener\".WeldInstantiator" => "Failed to start service Caused by: org.jboss.weld.resources.spi.ResourceLoadingException: Error while loading class javax.servlet.http.HttpServlet$NoBodyAsyncContextListener Caused by: java.lang.IncompatibleClassChangeError: javax.servlet.http.HttpServlet and javax.servlet.http.HttpServlet$NoBodyAsyncContextListener disagree on InnerClasses attribute"}}
已尝试以下排查手段,但问题未解决:
- 从pom.xml中移除
javax.servlet依赖 - 在
org.springframework.boot依赖中排除ch.qos.logback相关依赖
当前环境版本信息:
pom.xml配置版本
- Java 11
- Vaadin 23.0.1
- Wildfly Maven Plugin 4.0.0.Final
Docker运行环境
- JDK 11
- Wildfly 15.0.1.Final
- MSSQL_JDBC_VERSION 12.4.2.jre11
解决方案
这个错误核心是Servlet API类版本冲突,Wildfly 15自带的Servlet API版本与war包中打包的Servlet相关类版本不一致,导致内部类属性不兼容。
具体修复步骤:
- 强制标记Servlet API依赖为provided
即使手动移除了javax.servlet依赖,Vaadin或Spring Boot仍可能间接引入Servlet相关依赖。需在pom.xml中明确将所有Servlet API相关依赖设置为<scope>provided</scope>,避免打包进war包:
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <!-- 匹配Wildfly 15自带版本 --> <scope>provided</scope> </dependency>
同时检查Vaadin相关依赖,若存在传递引入的Servlet依赖,同样设置为provided。
- 清理Spring Boot打包的容器依赖
如果使用Spring Boot,默认war打包会包含Tomcat依赖,需排除并适配Wildfly容器:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency>
- 核对版本兼容性
Vaadin 23.0.1属于较新版本,而Wildfly 15基于Java EE 8,二者存在兼容性断层:
- 可选升级Wildfly到26+版本(支持Jakarta EE 8/9,适配Vaadin 23)
- 或降级Vaadin到14.x版本(兼容Java EE 8和Wildfly 15)
- 清理缓存确保产物纯净
清理Nexus中旧的war包缓存,同时清空本地Maven仓库的残留依赖,重新构建打包,避免混入旧版本类文件。
内容的提问来源于stack exchange,提问作者MSH
相关产品推荐
相关产品推荐

