Maven 构建跳过依赖于另一个模块的子模块
Maven build skips submodules which are dependency in another module
我有这样的嵌套多模块 maven 结构:
main_aggregator
|- submodule_A
| |- sub_submodule_1
| |- sub_submodule_2
|- submodule_B
|- submodule_C
pom.xml in main_aggregator 在模块
中有这个
<modules>
<module>submodule_A</module>
<module>submodule_B</module>
<module>submodule_C</module>
</modules>
pom.xml in submodule_A 在模块
中有这个
<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.
更新:
当我运行在一个线程中构建时,没有问题。只有在进行并行构建时才会出现问题。
更新2:
运行 在单线程中仅部分成功。看我的回答...
所以我发现了问题所在。问题是某种 "copy paste exception"。在聚合器 submodule_A 中,我从 main_aggregator 复制了 pom。当然我主要改了group id和artifact id,但是我没有改插件。
导致该问题的插件是 javadoc。特别是它的总体目标。当我删除它时,我可以构建整个项目(但不是并行的)。
问题是,显然在并行构建期间,聚合器项目正在构建 "out of order" 因为它没有依赖项(submodule_A 在构建子模块之前开始构建)。现在 javadoc 聚合开始发挥作用。
Javadoc 聚合分叉每个子模块构建(也许这是错误的术语)。但这不是按依赖项排序的,所以它失败了。
并行构建仍然存在问题,因为 main_aggregator 中 javadoc 的聚合目标会导致同样的问题。但这是另一个问题。
我从中又学到了一个教训。如果我将每个模块的全部 pom.xml 内容放入我的问题中,有人可能会看到问题。
因此,当您提出问题时,即使您认为细节无关紧要,也不要隐藏细节:)...
我有这样的嵌套多模块 maven 结构:
main_aggregator
|- submodule_A
| |- sub_submodule_1
| |- sub_submodule_2
|- submodule_B
|- submodule_C
pom.xml in main_aggregator 在模块
中有这个<modules>
<module>submodule_A</module>
<module>submodule_B</module>
<module>submodule_C</module>
</modules>
pom.xml in submodule_A 在模块
中有这个<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.
更新: 当我运行在一个线程中构建时,没有问题。只有在进行并行构建时才会出现问题。
更新2: 运行 在单线程中仅部分成功。看我的回答...
所以我发现了问题所在。问题是某种 "copy paste exception"。在聚合器 submodule_A 中,我从 main_aggregator 复制了 pom。当然我主要改了group id和artifact id,但是我没有改插件。
导致该问题的插件是 javadoc。特别是它的总体目标。当我删除它时,我可以构建整个项目(但不是并行的)。
问题是,显然在并行构建期间,聚合器项目正在构建 "out of order" 因为它没有依赖项(submodule_A 在构建子模块之前开始构建)。现在 javadoc 聚合开始发挥作用。
Javadoc 聚合分叉每个子模块构建(也许这是错误的术语)。但这不是按依赖项排序的,所以它失败了。
并行构建仍然存在问题,因为 main_aggregator 中 javadoc 的聚合目标会导致同样的问题。但这是另一个问题。
我从中又学到了一个教训。如果我将每个模块的全部 pom.xml 内容放入我的问题中,有人可能会看到问题。
因此,当您提出问题时,即使您认为细节无关紧要,也不要隐藏细节:)...