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

最佳答案

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

app-api/
app-impl/
app-war/
app-parent/
pom.xml
其中pom.xml是模块pom。
但是,您将在开源 Realm 看到的几乎每个项目都无法区分它们。
这是有原因的:许多插件在它们之间也没有区别。甚至Maven本身也假定了另一个设置:如果未设置<relativePath>,则Maven假定父对象位于..。因此,每个项目都必须指向<relativePath>../app-parent</relativePath>作为父项。
提到的结构中存在严重问题的最受欢迎的插件是maven-release-plugin!当您不遵循module-pom是parent-pom的假设时,将会遇到奇怪的问题。
最严重的错误是,发行版插件无法替换父级中的版本属性,并且由于SNAPSHOT依赖关系而失败。你 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版测试)失败,并显示一条消息,指出无法通过快照依赖项发布该模块。
如果仅“跳过”某些模块指令集,则在正确定义<relativePath>时这可能不是问题。但是您必须尝试预期Maven插件中的一些错误。除了这些错误,您完全可以将pom分开,如果您有时间制作沙盒版本,我会尝试一下。

10-01 18:47
查看更多