【发布时间】:2016-09-12 05:23:15
【问题描述】:
如果我的 pom 是其他 pom 的层次结构的子 pom,有没有办法准确显示哪个父 pom 包含插件的定义?
【问题讨论】:
如果我的 pom 是其他 pom 的层次结构的子 pom,有没有办法准确显示哪个父 pom 包含插件的定义?
【问题讨论】:
简短的回答很可能是:不。
根据 Maven 在执行某个构建之前构建其模型的方式,Maven Builder Model:
pom.xml 文件上完成的,这是由于合并、覆盖、分析、注入(属性)等的结果。
要查看完整的 pom,maven-help-plugin 的 effective-pom 目标绝对是正确的工具。它将显示(或写入给定文件)构建将使用的最终有效 pom。
只有在我们拥有有效的 pom 后才能创建插件的完整定义(其执行、其全局配置等),因为:
pluginManagement 部分都可以影响某个插件plugin 部分也会对其产生影响profiles 在层次结构中的任何点声明也可以影响它properties,如果用作占位符,也可以起到重要作用看一下官方Maven POM reference,我们可以看到很多入口点会影响某个插件的定义,这些入口点只有在通过整个 pom 层次合并后才会对我们的构建有效。定义本身并没有多大帮助,因为它可以在层次结构链上被进一步覆盖/影响。
想想plugin 的inherited 元素:
true或false,此插件配置是否应适用于继承自此的 POM。默认值为true。
或者合并pluginconfiguration部分:
默认行为是根据元素名称合并配置元素的内容。如果子 POM 具有特定元素,则该值将成为有效值。如果子 POM 没有元素,但父 POM 有,则父值成为有效值。
您可以通过向configuration元素的子元素添加属性来控制子 POM 如何从父 POM 继承配置。属性为combine.children和combine.self。在子 POM 中使用这些属性来控制 Maven 如何将来自父级的插件配置与子级中的显式配置结合起来。
或者根据execution 的plugin 进一步向下:
inherited:与上面的继承元素一样,设置此false将阻止 Maven 将此执行传递给其子代。此元素仅对父 POM 有意义。
然后可以通过pluginManagement影响整体管理:
插件管理以几乎相同的方式包含插件元素,除了不是为这个特定的项目构建配置插件信息,它旨在配置从这个项目继承的项目构建。但是,这仅配置子级的 plugins 元素中实际引用的插件。孩子们有权覆盖
pluginManagement定义。
因此,pom 层次结构中某个点的插件定义可能对最终的有效构建没有意义。
【讨论】: