Maven默认生命周期和插件部分

时间:2016-04-12 11:30:46

标签: java maven pom.xml

如果我错了,请纠正我。如果Maven pom.xml中未定义任何打包类型,则默认使用jar生命周期。

每个Maven打包类型都有默认的构建生命周期和相关的默认目标。 (我们可以将目标视为插件+命令

生命周期阶段目标

  • process-resources resources:resources
  • 编译编译器:编译
  • process-test-resources资源:testResources
  • test-compile compiler:testCompile
  • 测试surefire:test
  • package jar:jar
  • 安装install:install
  • 部署部署:部署

我的问题是
在定义包装类型时,我们可以说,就好像pom.xml插件部分填充了该包装构建生命周期的默认插件和目标吗?

同时
如果我们在插件部分定义一个插件,例如编译器插件,并给出其配置,这些配置是否会覆盖插件的默认配置?

1 个答案:

答案 0 :(得分:3)

  

如果没有在maven pom.xml中定义包装类型,则使用jar lifecyle。

几乎正确,jar不是一个生命周期,它是一个包装。 Maven有 build life cycles(干净,默认,网站),可以应用于任何包装。

根据官方Maven model

  

packaging此项目产生的工件类型,例如jar war ear pom。插件可以创建自己的包装,因此也可以创建自己的包装类型,因此该列表不包含所有可能的类型   默认值为jar

  

每个maven包装类型都有默认的构建生命周期

它没有默认生命周期,您在其项目上调用默认生命周期。它具有default bindings作为默认生命周期,也就是说,默认情况下,插件已根据定义的packaging类型附加到默认生命周期的各个阶段。

Maven的core concepts之一是约定优于配置。它的默认绑定强制执行这一原则,已经为给定的包装提供了某些插件某些目标的执行 例如,默认情况下,已经需要在maven-compiler-plugin阶段期间通过compile及其compile目标进行编译,测试(通过maven-surefire-plugin及其{{在应用默认值时test阶段内的1}}目标和test期间的maven-jar-plugin以及jar目标期间的目标{{1}包装。
(注意模式:我提到了插件,目标,阶段,即默认绑定)。

这就是为什么minimal pom已经可以做很多事了:再次,它的约定优于配置。

  

在定义包装类型时,我们可以说pom.xml插件部分是否填充了该包装构建生命周期的默认插件和目标?

实际上,就像使用默认配置执行默认附加插件和目标并使用默认配置分配给某些阶段一样,填充构建package部分。 另请注意,如果您添加相同插件和目标的进一步执行,它将在默认绑定指定的(之后)之上调用。如有需要,请参见下文如何防止它。

  

如果我们在插件部分定义一个插件,比如编译器插件,   并给它配置,这些配置是否覆盖了插件的默认配置?

您可以定义其他一个或多个目标的插件和jar,并附加到某个阶段。每个plugins都可以拥有自定义executions。但是,execution不在任何configuration部分中,但声明为通用/全局配置,然后将应用于相关插件的任何执行,同样也适用于默认通过包装绑定附加。

configuration元素上的官方POM reference

  

默认行为是根据元素名称合并execution元素的内容。如果子POM具有特定元素,则该值将成为有效值。如果子POM没有元素,但是父元素,则父值变为有效值。

关于configuration部分的configuration元素:

  

configuration:与上述相同,但将配置限制在此特定目标列表中,而不是插件下的所有目标。

这就是为什么您经常会看到execution的{​​{1}} / configuration配置,而没有任何source。它将应用于已通过默认绑定附加的target(源代码编译)和maven-compiler-plugin(测试代码编译)目标的默认执行。

此外,您甚至可以覆盖默认绑定,并通过为同一插件添加execution,同一目标,相同的执行ID (最重要的一点)将其从某个阶段中删除并将其附加到不同阶段或非现有阶段(或空)阶段。因此,您将禁用默认插件目标执行。您可以使用此技巧将插件目标执行添加为同一阶段的第一次执行:通过禁用默认执行,添加执行然后重新定义默认执行(然后使用不同的ID)。 Maven将遵循执行声明命令。

检查this SO answer有关如何生成执行ID的信息。这里的重点是official Maven documentation

  

通过指定POM打包的默认生命周期映射绑定到构建生命周期的每个mojo将分配一个compile的执行ID