Wildfly 34无法加载依赖JAR中带@WebServlet注解的Servlet问题咨询
问题原因及解决方案
核心原因
Jakarta EE 10 对应的 Servlet 6.0 规范变更了默认注解扫描行为:WEB-INF/lib 下的依赖 JAR 包默认不再自动扫描@WebServlet、@WebFilter等Servlet相关注解。而 Java EE 8(Servlet 4.0)及更早版本中,容器默认会扫描这些JAR中的注解,这就是Wildfly 26能加载、Wildfly 34不能加载的根本原因。
解决办法
方法1:通过web.xml配置扫描指定JAR或所有JAR
在项目的web.xml中添加<jar-scanning>配置,明确指定要扫描注解的JAR包,或者直接扫描所有WEB-INF/lib下的JAR:
扫描所有WEB-INF/lib中的JAR
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd" version="6.0" metadata-complete="false"> <jar-scanning> <scan-all/> </jar-scanning> </web-app>
扫描特定JAR包
如果只需要扫描某个依赖JAR,可指定JAR文件名:
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd" version="6.0" metadata-complete="false"> <jar-scanning> <scan>your-dependency.jar</scan> </jar-scanning> </web-app>
方法2:保留web-fragment.xml显式声明
你当前使用的在web-fragment.xml中显式声明Servlet的方式完全有效,这也是Servlet规范允许的方式,适合需要精确控制Servlet加载的场景。
注意事项
- 确保
web.xml的metadata-complete属性设置为false,否则容器会忽略所有注解,只读取web.xml和web-fragment.xml中的配置。 - Wildfly 34严格遵循Jakarta EE 10规范,所有配置需符合Servlet 6.0的schema要求。
内容的提问来源于stack exchange,提问作者Claudio Weiler
相关产品推荐
相关产品推荐

