gpt4 book ai didi

maven - 模块继承与聚合

转载 作者:行者123 更新时间:2023-12-03 14:00:28 27 4
gpt4 key购买 nike

我们有一个大而深的模块结构,具有三层“真实”的继承层和三到四层的模块聚合。
我对真正的继承很好:一个公司范围的 super pom、一个产品范围的父级和一个客户范围的父级,用于定制产品。
但我观察到“空”聚合模块也被定义为其子模块的父级。
如果整个概念与 OO 中的相同,那么如果聚合模块(除了它们的子模块之外它们是空的)没有向 pom.xml 添加特定配置,这对我来说毫无意义。
是否有任何其他原因(可能是可操作的)为什么这可能有用?
旁注:在这方面对 pom 的介绍不清楚:术语“父”不清楚:它可以表示 super pom(=继承树中的父级)或聚合 pom(=文件系统中的父级...)

最佳答案

Maven社区对这些概念的定义存在很大的问题。您说父 pom 是继承而 module-pom 是组合是正确的。但不幸的是,这两个概念的分离在 Maven 中没有历史。 Maven 文档清楚地表明最好将它们分开。这将导致这种理想的结构

app-api/
app-impl/
app-war/
app-parent/
pom.xml
其中 pom.xml 是模块 pom。
但是你在开源领域看到的几乎每个项目都没有区分它们。
这是有原因的:许多插件也没有区分它们。甚至 Maven 本身也假设了另一种设置:如果 <relativePath>未设置 Maven 假定父节点位于 .. .所以每个项目都要指向 <relativePath>../app-parent</relativePath>作为 parent 。
与上述结构存在巨大问题的最受欢迎的插件是 maven-release-plugin!当您不遵循 module-pom 是 parent-pom 的假设时,您将面临奇怪的问题。
最严重的错误是 release-plugin 无法替换您父级中的 version-properties 并且由于 SNAPSHOT-Dependencies 而失败。你的 parent 可能会包含这样的东西
<properties>
<app-api.version>1.1-SNAPSHOT</app-api.version>
<app-impl.version>1.2-SNAPSHOT</app-impl.version>
</properties>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>myorg</groupId>
<artifactId>app-api</artifactId>
<version>${app-api.version}</version>
</dependency>

<dependency>
<groupId>myorg</groupId>
<artifactId>app-impl</artifactId>
<version>${app-impl.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
通常,在发布这些属性时,这些属性会自动设置为其发布版本 1.1 和 1.2。但是发布插件(测试到版本 2.2.2)失败,并显示无法使用快照依赖项发布模块的消息。
如果您只“跳过”一些模块 pom,那么在定义 <relativePath> 时这可能不是问题。正确。但是您必须尝试并期待 Maven 插件中的一些错误。除了这些错误之外,您完全可以分离 pom,如果您有时间制作沙盒版本,我会尝试一下。

关于maven - 模块继承与聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17482320/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com