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

如何在Maven多模块项目中控制War子模块的构建顺序?

解决Maven多模块构建顺序问题

针对你的场景,要实现A1 > B1 > B2 > A2的构建顺序,核心是利用Maven反应器的依赖驱动构建规则,同时规避War包无法直接作为依赖的限制,具体方案如下:

1. 梳理基础依赖链

先确保模块间的基础依赖关系,让Maven自动处理前三个模块的顺序:

  • 在B1的pom.xml中添加对A1的Jar依赖:
    <dependencies>
        <dependency>
            <groupId>你的项目groupId</groupId>
            <artifactId>A1</artifactId>
            <version>项目版本号</version>
            <type>jar</type>
        </dependency>
    </dependencies>
    
  • 在B2的pom.xml中添加对B1的Jar依赖:
    <dependencies>
        <dependency>
            <groupId>你的项目groupId</groupId>
            <artifactId>B1</artifactId>
            <version>项目版本号</version>
            <type>jar</type>
        </dependency>
    </dependencies>
    
    这两步会让Maven自动保证A1 → B1 → B2的构建顺序。

2. 让A2依赖B2的Pom类型依赖

因为直接依赖War包会报错,我们可以依赖B2的Pom文件,仅用于触发构建顺序,不会引入War包本身:
在A2的pom.xml中添加:

<dependencies>
    <dependency>
        <groupId>你的项目groupId</groupId>
        <artifactId>B2</artifactId>
        <version>项目版本号</version>
        <type>pom</type>
        <scope>compile</scope>
    </dependency>
</dependencies>

Maven会识别到A2依赖B2的构建产物,从而将A2的构建放在B2之后。

3. 适配B模块的Profile加载逻辑

如果B模块是通过Profile激活加载的,为了避免未激活Profile时A2出现依赖缺失,将上述依赖放在相同的Profile中:
在A2的pom.xml中添加:

<profiles>
    <profile>
        <id>include-b</id> <!-- 与ROOT中加载B模块的Profile ID保持一致 -->
        <dependencies>
            <dependency>
                <groupId>你的项目groupId</groupId>
                <artifactId>B2</artifactId>
                <version>项目版本号</version>
                <type>pom</type>
            </dependency>
        </dependencies>
    </profile>
</profiles>

4. 配置A2的Assembly插件获取B2的War包

最后在A2中配置插件,确保能正确获取并处理B2的War包:
可以先用maven-dependency-plugin将B2的War包复制到指定目录,再让Assembly插件处理:

<build>
    <plugins>
        <!-- 复制B2的War包到Assembly输入目录 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy-b2-war</id>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>copy</goal>
                    </goals>
                    <configuration>
                        <artifactItems>
                            <artifactItem>
                                <groupId>你的项目groupId</groupId>
                                <artifactId>B2</artifactId>
                                <version>项目版本号</version>
                                <type>war</type>
                                <outputDirectory>${project.build.directory}/assembly-resources</outputDirectory>
                            </artifactItem>
                        </artifactItems>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <!-- 执行Assembly打包 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <executions>
                <execution>
                    <id>package-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                    <configuration>
                        <descriptors>
                            <descriptor>src/main/assembly/your-assembly.xml</descriptor>
                        </descriptors>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

在你的Assembly描述文件中,直接引用上述目录下的War包即可完成复制操作。

内容的提问来源于stack exchange,提问作者wi2ard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 13:05:25