2

我有这样的嵌套多模块maven结构:

main_aggregator
|- submodule_A
|  |- sub_submodule_1
|  |- sub_submodule_2
|- submodule_B
|- submodule_C

main_aggregator 中的 pom.xml 在模块中有这个

<modules>
    <module>submodule_A</module>
    <module>submodule_B</module>
    <module>submodule_C</module>
</modules>

submodule_A 中的 pom.xml 在模块中有这个

<modules>
    <module>sub_submodule_1</module>
    <module>sub_submodule_2</module>
</modules>

main_aggregator 的子模块的父级是这样的:

<parent>
    <groupId>my.project</groupId>
    <artifactId>main-parent</artifactId>
    <version>0.0.1</version>
    <relativePath/>
</parent>

submodule_A 的子模块的父级是这样的:

<parent>
    <groupId>my.project</groupId>
    <artifactId>specific-parent</artifactId>
    <version>0.0.1</version>
    <relativePath/>
</parent>

重要的是submodule_B 依赖于 sub_submodule_1 和 sub_submodule_2

当我从 main_aggregator 运行构建时,它失败并说它无法解决 submodule_B - sub_submodule_1 和 sub_submodule_2 的依赖关系。

在我看到的反应器摘要中,首先构建了 submodule_A 并且构建成功,但它是子模块 - sub_submodule_1 和 sub_submodule2 被跳过。所以我明白了,为什么它会在缺少依赖项时失败,但我不明白为什么 maven 没有首先构建这些依赖项。我也不明白为什么 submodule_A 的构建在子模块甚至没有构建时被标记为成功。

Maven 版本是 3.5.2。

更新:当我在一个线程中运行构建时,没有问题。仅在进行并行构建时才会出现问题。

Update2:在单线程中运行只是部分成功。看我的回答...

4

1 回答 1

1

所以我发现了问题所在。问题是某种“复制粘贴异常”。在作为聚合器的 submodule_A 中,我从 main_aggregator 复制了 pom。当然,我更改了组 ID 和工件 ID 等主要内容,但我没有更改插件。

导致该问题的插件是 javadoc。特别是它的总体目标。当我删除它时,我可以构建整个项目(但不能并行)。

问题是,显然在并行构建期间,聚合器项目是“乱序”构建的,因为它没有依赖项(submodule_A 在构建子模块之前开始构建)。现在 javadoc 聚合开始发挥作用。

Javadoc 聚合分叉了每个子模块构建(也许这是错误的术语)。但这不是由依赖项排序的,所以它失败了。

并行构建仍然存在问题,因为 main_aggregator 中 javadoc 的聚合目标会导致相同的问题。但这是另一个问题。

我从中又学到了一个教训。如果我将每个模块的整个 pom.xml 的内容放在我的问题中,那么有人可能会看到问题。

因此,当您询问某事时,即使您认为它们无关紧要,也不要隐藏细节:)...

于 2017-11-27T07:03:44.267 回答