Maven多模块项目的构建顺序?

2022-08-31 14:35:43

情况是,我有两个具有相同结构的Maven多模块项目:

Parent
    - Module 1
    - Module 2

当我构建项目1时,我看到首先构建父级(顺序是父级>模块1->模块2)。但是,对于项目2,最后构建了父级(顺序是module1->module2->parent)。为什么这两个项目有不同的构建顺序?此外,如何手动控制构建顺序?

更新1:
两个父项目都是没有源代码的简单POM项目,所以我无法根据依赖关系图解释构建顺序。

更新 2:
父 POM 是相同的,除了 GAV 和子模块名称:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>parent-group-id</groupId>
    <artifactId>parent-artifact-id</artifactId>
    <version>parent-version</version>
    <packaging>pom</packaging>
    <name>parent-name</name>
    <modules>
        <module>module-1</module>
        <module>module-2</module>
    </modules>
</project>

答案 1

构建顺序由Maven反应堆确定,Maven反应堆是一种通过对项目进行排序来自动确保多模块构建的正确构建顺序的机制。

请参阅官方文档了解其工作原理。

它说:

在对项目进行排序时,以下关系将得到尊重:

  • 生成中另一个模块的项目依赖关系
  • 一个插件声明,其中插件是构建中的另一个模块
  • 对构建中另一个模块的插件依赖
  • 生成中另一个模块上的生成扩展声明
  • 元素中声明的顺序(如果没有其他规则适用)

您无法手动控制构建顺序。如果要更改顺序,则必须对项目进行影响反应堆分类顺序的更改。


答案 2

在较高级别,生成顺序基于模块依赖关系图的拓扑排序

编辑:问题给你。我知道项目1包含两个模块,项目2也是如此。但是项目 2 中的模块是否显式声明“父”pom 为父项?我在想,也许你的项目1模块明确声明了父pom,而项目2模块没有。这意味着项目2“父”根本不是真正的父级,因此不必在模块之前构建。反正这是我的猜测。


推荐