【问题标题】:How to show which parent pom contains a plugin?如何显示哪个父 pom 包含插件?
【发布时间】:2016-09-12 05:23:15
【问题描述】:

如果我的 pom 是其他 pom 的层次结构的子 pom,有没有办法准确显示哪个父 pom 包含插件的定义?

【问题讨论】:

    标签: maven maven-3 pom.xml


    【解决方案1】:

    简短的回答很可能是:不。

    根据 Maven 在执行某个构建之前构建其模型的方式,Maven Builder Model

    • 在第 1 阶段解决了 pom 的层次结构
    • 在第 2 阶段模型规范化和插件配置得到进一步解决
    • 但只有在第 2 阶段结束时才会执行有效的模型验证,这是在最终有效的pom.xml 文件上完成的,这是由于合并、覆盖、分析、注入(属性)等的结果。

    要查看完整的 pom,maven-help-plugineffective-pom 目标绝对是正确的工具。它将显示(或写入给定文件)构建将使用的最终有效 pom。

    只有在我们拥有有效的 pom 后才能创建插件的完整定义(其执行、其全局配置等),因为:

    • 层次结构中任何点的pluginManagement 部分都可以影响某个插件
    • 层次结构中任何点的plugin 部分也会对其产生影响
    • profiles 在层次结构中的任何点声明也可以影响它
    • properties,如果用作占位符,也可以起到重要作用

    看一下官方Maven POM reference,我们可以看到很多入口点会影响某个插件的定义,这些入口点只有在通过整个 pom 层次合并后才会对我们的构建有效。定义本身并没有多大帮助,因为它可以在层次结构链上被进一步覆盖/影响。


    想想plugininherited 元素:

    truefalse,此插件配置是否应适用于继承自此的 POM。默认值为true

    或者合并pluginconfiguration部分:

    默认行为是根据元素名称合并配置元素的内容。如果子 POM 具有特定元素,则该值将成为有效值。如果子 POM 没有元素,但父 POM 有,则父值成为有效值。
    您可以通过向 configuration 元素的子元素添加属性来控制子 POM 如何从父 POM 继承配置。属性为combine.childrencombine.self。在子 POM 中使用这些属性来控制 Maven 如何将来自父级的插件配置与子级中的显式配置结合起来。

    或者根据executionplugin 进一步向下:

    inherited:与上面的继承元素一样,设置此false 将阻止 Maven 将此执行传递给其子代。此元素仅对父 POM 有意义。

    然后可以通过pluginManagement影响整体管理:

    插件管理以几乎相同的方式包含插件元素,除了不是为这个特定的项目构建配置插件信息,它旨在配置从这个项目继承的项目构建。但是,这仅配置子级的 plugins 元素中实际引用的插件。孩子们有权覆盖pluginManagement 定义。

    因此,pom 层次结构中某个点的插件定义可能对最终的有效构建没有意义。

    【讨论】:

    • 很好的解释。但从实际的角度来看,至少根据我的经验,平均继承链并不那么深。简单地通过层次结构找到一个特定的插件并不难。当然,您必须手动完成,但您不应该每天都这样做。
    猜你喜欢
    • 2014-05-03
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 2017-01-02
    • 2021-07-12
    相关资源
    最近更新 更多