You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:32:45