我的聚合器的 parent 也是一个 child,这对 Maven 来说似乎没问题

My aggregator's parent is also a child and that seems ok to Maven

编辑:问题的答案是"that's impossible, you've either found a bug in Maven or have misunderstood something"。

我的情况是后者。

X和X/EXTRA都使用相对路径继承自R(X使用../R,X/EXTRA使用../../R)。所以实际上没有循环

现实生活中的结构要复杂得多,我试图将其缩小到一个简单的例子。

我调整了结构(移动到 R/EXTRA)并通过配置跳过 maven-deploy-plugin 中的部署实现了该团队的目标。

我不能再删除这个问题了,但希望这能澄清一些事情...


maven 聚合器模块 X 怎么可能从 parent R 继承并且仍然在其聚合模块列表中包含 parent?

详细示例:

项目 R 是一个根(没有 parent),它聚合了模块 A、B 与:

<modules>
  <module>A<module>
  <module>B<module>
</modules>

项目 X 与 R 一起添加,将 R 声明为它的 parent,它从那里继承了一些东西,并且将 R 作为一个 child 模块被聚合。所以目录结构看起来像:

R/
R/A
R/B
X/
X/EXTRA

而 X 有:

    <parent>
        <groupId>id.of.Xgroup</groupId>
        <artifactId>X</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath>../X</relativePath>
    </parent>
...
    <modules>
        <module>../X</module>
        <module>../EXTRA</module>

这对我来说工作正常(Maven 3.3.9),我可以看到 X 从 R 正确继承,因为它使用仅在 R 中指定的 属性(jacoco 版本)。它也会导致一切待构建(顺序为 R、A、B、EXTRA、X 并且 EXTRA 使用 A/B 作为依赖项)因此聚合似乎也很好。

我只想知道为什么允许这样做。这是设计使然并且绝对安全(可能不会出现循环冲突)并且 how/why 这保证有效吗?

由于R没有返回到X的依赖,所以目前没有循环依赖。 (但仍然是一个有风险且糟糕的设计)

在这种情况下,将 R 作为 X 中的一个模块并不是最佳解决方案,我建议将其移除。 (删除后,将 X 作为模块添加到 R 会更合适。如果您不想这样做,请尝试以下建议)

如果 X 将 R 作为模块的原因是,当您在 X 上执行某个插件(或 maven 命令)时,您希望它也能在 R 上执行;我建议创建另一个以 X 和 R 作为模块的聚合器,在这个新创建的聚合器上执行这个提到的插件。