升级SpringBoot3.0.0后WildFly22部署模块的警告问题求解
警告:无法在Service Module Loader的模块“deployment. .war”中定义类org.springframework.web.servlet.tags.form.AbstractHtmlElementTag:java.lang.NoClassDefFoundError:无法链接org/springframework/web/servlet/tags/form/AbstractHtmlElementTag(来自Service Module Loader的模块“deployment. .war”):jakarta/servlet/jsp/tagext/DynamicAttributes
从SpringBoot 2.5.x升级到3.0.0后,使用WildFly22(Eclipse服务器)部署模块时,Eclipse控制台出现上述警告信息。
环境配置
eclipse 2021-09 java 17.0.5 wildfly 22 springboot-starter-parent-3.0.0 spring.framework.version-6.0.2 jakarta.servlet-api-6.0.0 jakarta.servlet.jsp.jstl-api-3.0.0 jakarta.servlet.jsp-api-3.1.1
已尝试的解决方法
- 检查spring-webmvc-6.0.2(AbstractHtmlElementTag来自该依赖包)与jakarta.servlet.jsp-api-3.1.1(DynamicAttributes.class来自该依赖包)之间的兼容性。
- 检查是否存在依赖冲突。
- 删除本地Maven仓库中的JAR文件并重新下载。
但问题仍未解决。
解决建议
1. 升级WildFly版本
SpringBoot 3.x和Spring Framework 6.x基于Jakarta EE 9/9.1规范,而WildFly22仅支持Jakarta EE 8。两者核心API包名已从javax.*切换到jakarta.*,WildFly22自带的Servlet/JSP组件还是javax版本,和你引入的jakarta.servlet-api-6.0.0完全不兼容,直接导致找不到jakarta.servlet.jsp.tagext.DynamicAttributes类。
建议直接升级到WildFly 27及以上版本,这类版本原生支持Jakarta EE 9/9.1,能和SpringBoot 3.x完美适配。
2. 临时调整依赖范围(仅作应急尝试)
如果暂时无法升级WildFly,可将Jakarta相关依赖设为provided范围,让WildFly提供的组件生效,但注意WildFly22的组件是javax版本,和SpringBoot3.x的jakarta要求不匹配,这个方法大概率无法彻底解决问题,仅作为临时测试:
<dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>6.0.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>jakarta.servlet.jsp</groupId> <artifactId>jakarta.servlet.jsp-api</artifactId> <version>3.1.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>jakarta.servlet.jsp.jstl</groupId> <artifactId>jakarta.servlet.jsp.jstl-api</artifactId> <version>3.0.0</version> <scope>provided</scope> </dependency>
3. 排查并排除冲突依赖
执行Maven命令查看完整依赖树,定位是否存在javax/jakarta混合的冲突依赖:
mvn dependency:tree
找到相关冲突的依赖后,在pom.xml中通过<exclusions>标签排除。
内容的提问来源于stack exchange,提问作者RAJURI ACHITHU VARDHAN BABU

