WildFly18→26升级后WAR中ejb-jar.xml的MDB配置失效
1. WAR中的EJB是否支持ejb-jar.xml?
没有任何规范或WildFly文档禁止WAR中的EJB使用ejb-jar.xml。根据Jakarta EE规范,WAR包中内嵌在WEB-INF/lib下的EJB JAR包,其META-INF/ejb-jar.xml会被容器正常加载;同时WAR根目录下的WEB-INF/ejb-jar.xml也可用于配置WAR内的所有EJB,WildFly完全支持这种配置方式。
2. WildFly 23+是否支持用ejb-jar.xml/jboss-ejb3.xml配置MDB?
WildFly 23及更高版本完全支持通过ejb-jar.xml或jboss-ejb3.xml配置MDB,大量企业项目(尤其是遗留系统或需要集中配置的场景)仍在使用这种方式,官方文档也明确保留了相关配置说明。
3. 本次启动失败的原因分析
结合异常信息和配置情况,问题大概率出在以下几个方面:
EJB名称不匹配:XML配置中
<ejb-name>为XMdb,但异常中提到的MDB是MyMdb,说明XML配置未关联到实际的MDB组件。需检查:- MDB类上
@MessageDriven注解的name属性是否为XMdb; - 若未指定
name,默认EJB名称是否与XMdb一致(默认是类名首字母小写,如xMdb,可能和XML中的XMdb大小写不匹配)。
- MDB类上
配置属性解析失败:XML中
destination的值为${activemq.xxxQueueName},若该系统/配置属性未在WildFly中正确定义(比如standalone.xml/domain.xml未配置,或WAR部署时未传入),会导致解析后的值为空,触发ActiveMQ资源适配器的必填项校验。XML命名空间/版本不兼容:WildFly 26基于Jakarta EE 9.1,ejb-jar.xml需使用对应的命名空间和版本。若仍使用旧Java EE的命名空间(如
http://xmlns.jcp.org/xml/ns/javaee),可能导致配置无法被正确解析。正确的ejb-jar.xml根元素应为:<ejb-jar xmlns="https://jakarta.ee/xml/ns/jakartaee" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/ejb-jar_4_0.xsd">配置文件加载优先级问题:若同时存在多个配置源(如注解和XML),需确认XML配置的优先级是否被正确应用。不过你提到注解配置正常,说明核心配置逻辑没问题,重点还是XML与MDB的匹配或属性解析问题。
内容的提问来源于stack exchange,提问作者László Tóth

