Maven:如何不依赖 Parent POM

Maven: how to not depend on Parent POM

我有一个 Maven multi-module 项目。像这样:

- ParentProject
   - ChildA
   - ChildB
   - ChildC 

child 项目继承自 Parent POM (ParentProject) 仅仅是为了共享 <build><scm><properties>,以免在所有 child 模块中重复。因此,parent-child 关系的 objective 与依赖关系没有任何关系。它在 build-time 发挥作用,而不是在运行时,可以这么说。

child 项目的工件供更广泛的受众使用,因此它们将发布到集中式存储库中。

如何从 child 消费者的角度“打破”从 child 到 parent 之间的关系?

假设另一个项目 ProjectX 添加了对 ChildA 的依赖。执行此操作时,Maven 客户端不仅会尝试下载 ChildA 本身的 POM 和工件,甚至还会尝试下载 ParentProject 的 POM。但是,从消费者的角度来看,绝对不需要那个 POM。它不包含消费者需要知道的信息。

如何从消费者的角度打破这种关系?强制将 ParentProject 的 POM 发布到存储库中似乎毫无意义,因为那里没有人需要它。

也许 Maven 可以通过另一种方式让我在项目之间共享构建指令和属性等内容,而无需强制 Parent POM 存在于集中式存储库中?

或者也许我可以通过某种方式来操纵 Child 项目的 POM,这些项目被放入集中式存储库(删除 <parent> 元素,因为它是不相关的)。

也许只有我,但我觉得 Maven 在这里混淆了两个不相关的概念(build-time 与 consume-time)并在 repo 中强制进行不必要的往返和不必要的工件。我还没有涉足 Gradle,但我想知道它是否做得更好?

通常,Maven POM 既是构建 POM,也是消费者 POM。这并不理想,并且可能会在 Maven 的未来版本中改变。

目前,您最好的选择似乎是 flatten Maven 插件,它允许您在上传之前删除 POM 的“不必要”部分。