部署含WAR的EAR时,如何配置Wildfly使用其内置模块?
我来帮你搞定这个问题——当把WAR打包进EAR后,jboss-deployment-structure.xml的配置逻辑和单独部署WAR时完全不同,你需要调整EAR根目录的配置文件,让子WAR正确依赖Wildfly的dom4j模块。具体步骤如下:
调整EAR层级的jboss-deployment-structure.xml结构
你需要针对EAR里的WAR子部署单独配置依赖,而不是像单独WAR那样直接写全局依赖。举个例子,假设你的WAR文件名为my-web-app.war,那么EAR根目录的配置文件应该写成这样:<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2"> <!-- 这里的name必须和EAR中WAR的文件名完全一致,包括后缀 --> <sub-deployment name="my-web-app.war"> <dependencies> <!-- Wildfly 11中dom4j的默认模块名是org.dom4j --> <module name="org.dom4j" export="true"/> </dependencies> </sub-deployment> </jboss-deployment-structure>重点注意:
<sub-deployment>的name属性必须和EAR包内WAR的实际文件名完全匹配,大小写、后缀都不能错,否则Wildfly找不到对应的子部署来应用配置。清理WAR内的旧配置
如果你的WAR原来的WEB-INF目录下还保留着jboss-deployment-structure.xml,建议直接删除它。EAR层级的配置会优先生效,保留WAR内的旧配置可能会导致依赖冲突或者配置不生效。确认Wildfly模块的正确性
先检查Wildfly 11的模块目录modules/system/layers/base/org/dom4j是否存在,打开里面的module.xml确认模块名称确实是org.dom4j。如果你的dom4j是自定义模块,那要把module name改成你自定义的模块名。排查日志定位问题
如果部署还是失败,去Wildfly的standalone/log/server.log里找具体报错信息:- 如果报错是
ModuleNotFound,说明模块名称写错了或者模块不存在; - 如果报错是找不到子部署,那就是
<sub-deployment>的name和WAR文件名不匹配。
- 如果报错是
内容的提问来源于stack exchange,提问作者Dave

