【问题标题】:Maven: how to not depend on Parent POMMaven:如何不依赖父 POM
【发布时间】:2021-02-11 17:21:20
【问题描述】:

我有一个 Maven 多模块项目。像这样的:

- ParentProject
   - ChildA
   - ChildB
   - ChildC 

子项目继承自父 POM (ParentProject) 仅仅是为了共享 <build><scm><properties> 等内容,以免在所有子模块中重复。因此,父子关系的目标与依赖关系没有任何关系。可以说,它在构建时起作用,而不是在运行时起作用。

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

从孩子的消费者的角度来看,我如何“打破”从孩子到父母的关系?

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

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

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

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

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

【问题讨论】:

    标签: maven gradle maven-3


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。我认为Maven Flatten Plugin 正是我所需要的。似乎其他人对 Maven 的这种“设计缺陷”有疑问。 :-)
    • 1 小时后:效果很好。为了更正我之前的评论,插件的正确名称是 Flatten Maven Plugin(不是 Maven Flatten Plugin),因为这不是官方插件。
    • 我看到在 Maven 4.0 中可能有一个官方解决方案(我了解到它被称为“构建与消费者 POM”)。讨论和解释here。很高兴看到 Maven 向前发展。
    猜你喜欢
    • 2015-10-07
    • 2019-10-16
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    相关资源
    最近更新 更多