如何通过Maven构建包含两个子WAR包并正常注册的最终WAR包?
嘿,我来帮你搞定这个打包问题!你想把前端AngularJS和后端REST接口两个子WAR打包成一个独立WAR部署到WildFly,而且不想用EAR,这个需求完全可以实现——核心是利用WildFly的嵌套WAR部署特性,再配合正确的构建配置和部署描述符就行。
为什么你之前只看到第一个模块被加载?
WildFly(包括老版本JBoss)默认只会识别WAR根目录下的部署配置(比如jboss-web.xml),不会自动扫描并加载嵌套在WAR里的其他WAR包。你之前直接把两个子WAR塞进去,但没告诉WildFly要处理它们,所以它只会加载第一个被识别到的模块。
具体实现方案
1. 调整父WAR的目录结构与部署配置
你需要在父WAR的WEB-INF目录下创建一个jboss-deployment-structure.xml文件,显式告诉WildFly要加载这两个子WAR,并为它们分配独立的上下文根,避免路由冲突。
示例配置如下:
<jboss-deployment-structure> <deployment> <!-- 声明嵌套的子WAR部署 --> <sub-deployments> <sub-deployment name="Frontend.war"> <!-- 前端模块的访问路径 --> <context-root>/frontend</context-root> </sub-deployment> <sub-deployment name="BackendApi.war"> <!-- 后端API的访问路径 --> <context-root>/backend-api</context-root> </sub-deployment> </sub-deployments> </deployment> </jboss-deployment-structure>
注意:子WAR的文件名要和
name属性完全一致,否则WildFly找不到对应的包。另外,子WAR自身的jboss-web.xml里的context-root会被这个配置覆盖,所以可以统一在这里管理。
2. 配置构建脚本,把两个子WAR打包进父WAR
假设你用Maven构建,修改父WAR模块的pom.xml,用maven-war-plugin把两个子WAR复制到父WAR的指定目录(比如WEB-INF/nested-wars/):
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.3.2</version> <configuration> <webResources> <!-- 复制前端WAR到嵌套目录 --> <resource> <directory>${project.basedir}/../Frontend/target</directory> <includes> <include>Frontend.war</include> </includes> <targetPath>WEB-INF/nested-wars</targetPath> </resource> <!-- 复制后端API WAR到嵌套目录 --> <resource> <directory>${project.basedir}/../BackendApi/target</directory> <includes> <include>BackendApi.war</include> </includes> <targetPath>WEB-INF/nested-wars</targetPath> </resource> </webResources> <!-- 如果父WAR本身不需要web.xml,开启这个配置 --> <failOnMissingWebXml>false</failOnMissingWebXml> </configuration> </plugin>
如果用Gradle,配置类似:
war { // 引入前端子WAR from project(':Frontend').tasks.war.archiveFile into 'WEB-INF/nested-wars' // 引入后端API子WAR from project(':BackendApi').tasks.war.archiveFile into 'WEB-INF/nested-wars' }
3. 部署验证
构建完成后,把生成的父WAR包部署到WildFly,查看日志你会看到类似这样的输出,说明两个子模块都被成功加载:
[org.jboss.as.server.deployment] (MSC service thread 1-8) WFLYSRV0027: Starting deployment of "Frontend.war" (runtime-name: "Frontend.war") [org.jboss.as.server.deployment] (MSC service thread 1-4) WFLYSRV0027: Starting deployment of "BackendApi.war" (runtime-name: "BackendApi.war")
之后就可以通过配置的上下文根访问两个模块了:
- 前端:
http://your-wildfly-host:8080/frontend - 后端API:
http://your-wildfly-host:8080/backend-api
额外注意事项
- 如果父WAR本身需要提供共享资源或过滤器,完全可以保留自己的
WEB-INF内容,不会影响子WAR的加载。 - 确保子WAR的文件名没有重复,否则WildFly会报错。
- 如果你不需要父WAR有自己的上下文根,可以不用给它配置
jboss-web.xml,WildFly会自动处理。
内容的提问来源于stack exchange,提问作者LLL RRR
相关产品推荐
相关产品推荐

