ChatGPT解决这个技术问题 Extra ChatGPT

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

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

Parent
    - Module 1
    - Module 2

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

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

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

<?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>
你如何调用这两个构建?这里的细节可能很重要。
由于版本不匹配,我在多模块项目中遇到了这种行为。根 pom.xml 版本是手动碰撞的,但子模块 pom.xml 仍然引用旧的父版本。
从maven 3.5.0+(2017)开始,可以避免在每个模块中重复父版本,看:stackoverflow.com/questions/10582054/…

C
Community

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

请参阅 the official documentation 了解其工作原理。

它说:

对项目进行排序时遵循以下关系: 项目依赖于构建中的另一个模块 插件声明,其中插件是构建中的另一个模块 插件依赖于构建中的另一个模块 构建扩展声明对构建中的另一个模块在元素中声明的顺序(如果没有其他规则适用)

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


但这并不能解释为什么这两个项目有不同的构建顺序。
它不应该是不同的。没有更多的不同了吗?孩子有同一个父母吗?
检查子模块中的父版本
佚名

在较高级别上,构建顺序基于模块依赖关系图的 topological sort

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


但是两个父项目都是简单的 POM 项目,没有任何源代码。依赖关系图在这里没有意义。
引用父 POM 也是一个依赖项。
Y
Yiğit Duman

我最近在使用 CentOS 7 时遇到了这个问题。我将 Maven 从 3.0.5 更新到 3.5.3,问题已经解决。如果有人也有这个问题,您可以先尝试这样做。


欢迎来到 SO。对于这样一个老问题,这似乎不太可能回答。有关如何回答问题的帮助,请参阅 stackoverflow.com/help/how-to-answer
我是为像我这样的人写的。我有这个问题,找不到任何东西。然后我自己解决并写到这里,所以如果人们遇到这个问题并谷歌它,他们可以找到一些东西。
I
Illya Kysil

概括

为什么?

Maven 使用 <module> 声明来确定要包含在当前运行中的模块列表。 Maven 使用 <parent> 声明为每个包含的模块 生成有效的 POM,然后用于执行该模块的构建。

Project 1 中,module1module2 中的每一个都在 <parent> 部分指定了 parent 模块。在 Project 2 中,module1module2 均未在 <parent> 部分指定 parent 模块。

如何手动控制构建顺序?

通过更改模块之间的依赖关系,包括 <parent><dependencies>、插件依赖关系等,如 the official documentation 中所述。

另请查看 Introduction to the POM 以了解有关聚合和继承的讨论。

细节

从聚合(<module> 声明)和继承(<parent> 声明)的角度来看,Maven 中有 4 种可能的模块关系场景。

让我们假设一个带有包装 pom 的模块 A 和一个模块 B(包装无关紧要)。模块 A 可以是父模块或聚合器。模块 B 可以将 A 引用为父级,也可以不引用。

情况1:

AB 都不会相互引用 - 模块是独立的。 Maven 无法控制构建顺序,每个模块都是独立构建的,具有手动构建顺序控制。

案例二:

模块 A 包含 <modules> 中的模块 B。模块 B 不声明 A 为父模块。在这种情况下,模块 A 是模块 B 的聚合器。

Maven 调用 mvn -f A/pom.xml 将首先构建 B,然后构建 A。

Maven 调用 mvn -f B/pom.xml 将仅构建 B。

案例3:

模块 A 包含 <modules> 中的模块 B。模块 B 声明 A 为父模块。在这种情况下,模块 A 既是模块 B 的父级也是聚合器(反应器)。

Maven 调用 mvn -f A/pom.xml 将首先构建 A,然后构建 B。

Maven 调用 mvn -f B/pom.xml 将仅构建 B,但将使用 A 的 POM 通过从本地存储库或遵循 /project/parent/relativePath 解析它来生成 B 的有效 POM。

案例4:

模块 A 不包括 <modules> 中的模块 B。模块 B 声明 A 为父模块。在这种情况下,模块 A 是模块 B 的父级。

Maven 调用 mvn -f A/pom.xml 将仅构建 A。

Maven 调用 mvn -f B/pom.xml 将仅构建 B,但将使用 A 的 POM 通过从本地存储库或遵循 /project/parent/relativePath 解析它来生成 B 的有效 POM。


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅