我的聚合器的父母也是一个孩子,对Maven来说似乎没问题

时间:2018-03-21 10:42:51

标签: maven maven-3

编辑:问题的答案是"这是不可能的,你或者在Maven中发现了一个错误或者误解了某些内容"。

就我而言,是后者。

X和X / EXTRA都使用从R继承的相对路径(X使用../R而X / EXTRA使用../../R)。所以实际上没有周期。

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

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

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

maven聚合器模块X如何可以从父R继承但仍然在其聚合模块列表中包含该父级?

精心制作的例子:

项目R是根(无父),它将模块A,B聚合为:

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

项目X与R一起添加,声明R作为其父项,它从AND继承了东西,并将R作为聚合的子模块。所以目录结构如下:

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作为依赖关系)因此聚合似乎也很好。

我只是想知道为什么允许这样做的原因。这是设计和绝对安全(不会出现循环冲突)以及如何/为什么保证这有效?

1 个答案:

答案 0 :(得分:1)

由于R没有依赖回X,因此目前没有循环依赖。 (但仍然是一个冒险和糟糕的设计)

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

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