26

我们有一个大而深的模块结构,具有三层“真实”的继承层和三到四层的模块聚合。

我对真正的继承很好:一个公司范围的超级 pom、一个产品范围的父级和一个客户范围的父级,用于定制产品。

但我观察到“空”聚合模块也被定义为其子模块的父级。

如果整个概念与 OO 中的相同,那么如果聚合模块(除了它们的子模块之外它们是空的)没有向 pom.xml 添加特定配置,这对我来说毫无意义。

是否有任何其他原因(可能是可操作的)为什么这可能有用?

旁注:在这方面对 pom 的介绍不清楚:术语“父”不清楚:它可以表示超级 pom(=继承树中的父级)或聚合 pom(=文件系统中的父级...)

4

4 回答 4

27

Maven社区对这些概念的定义存在很大的问题。您说parent-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>父级。

与上述结构存在巨大问题的最受欢迎的插件是 maven-release-plugin!当您不遵循 module-pom 是 parent-pom 的假设时,您将面临奇怪的问题。

最严重的错误是 release-plugin 无法替换您父级中的 version-properties 并且由于 SNAPSHOT-Dependencies 而失败。你的父母可能会包含这样的东西

<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)失败,并显示无法使用快照依赖项发布模块的消息。

如果您只“跳过”一些模块 poms,那么在您正确定义时这可能不是问题<relativePath>。但是您必须尝试并期待 Maven 插件中的一些错误。除了这些错误之外,您完全可以分离 pom,如果您有时间制作沙盒版本,我会尝试一下。

于 2013-07-05T13:26:55.720 回答
3

IIUC 的简短回答是,您不会从仅聚合的 pom 继承。当您的聚合器与您的父级相同时,您会这样做,就像在规范的 Maven 结构中一样。但是,如果您将聚合器与父级分开,则不要从聚合器继承

于 2013-07-05T14:39:00.787 回答
2

如果您有对多个项目有效的属性,则父 pom 的继承很有用。据我了解,你已经得到了正确的部分;-)

你所说的聚合模块也有一个有效的实际用途。您可以将多个子模块组合成一个 pom。如果您想构建您的项目,您通常不想单独构建每个模块,而是将它们连接到一个应用程序中。这可以通过这样一个引用所有子模块的 pom 来完成。它不能只用父 pom 的概念来完成,因为它对其他模块一无所知。

于 2013-07-05T13:37:38.610 回答
1

在此处添加 Eclipse 透视图:当您使用 Eclipse IDE 的向导在 maven 项目中创建 maven 模块时,默认情况下,新模块将创建为顶级项目的子项目,并且顶级项目将是子项目的聚合。

于 2018-06-19T02:07:00.367 回答