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

Gio*_*nJh 4 java pom.xml maven

如果我错了,请纠正我。如果 Maven 中没有定义打包类型pom.xmljar则默认使用生命周期。

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

生命周期阶段目标

  • 流程资源 资源:资源
  • 编译编译器:编译
  • 流程测试资源资源:testResources
  • 测试编译器:testCompile
  • 测试万无一失:测试
  • 包jar:jar
  • 安装安装:安装
  • 部署部署:部署

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

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

A_D*_*teo 5

如果maven pom.xml中没有定义打包类型,则使用jar生命周期。

几乎正确,jar不是生命周期,而是包装。Maven 具有三个 构建生命周期(clean、default、site),可以应用于任何打包。

根据官方Maven 模型

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


每个 Maven 打包类型都有一个默认的构建生命周期

它没有默认的生命周期,您可以在其项目上调用默认的生命周期。它具有默认生命周期的默认绑定,也就是说,插件已经根据定义的packaging类型默认附加到默认生命周期的阶段。

Maven 的核心概念之一是约定优于配置。它的默认绑定强制执行这一原则,已经为给定的包提供了某些插件的某些目标的执行。
例如,默认maven-compiler-plugin情况compilecompilemaven-surefire-plugin在应用​​默认 ( ) 包装。 (注意模式:我提到了一个插件、一个目标、一个阶段,即默认绑定)。testtestmaven-jar-pluginjarpackagejar

这就是为什么最小的 pom已经可以做很多事情:同样,它是约定优于配置。


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

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


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

您可以定义更多插件及其executions一个或多个目标,附加到某一阶段。每个都execution可以有一个定制configuration。但是,configuration不在任何execution部分中但声明为通用/全局配置的 a 将应用于相关插件的任何执行,因此也应用于默认通过打包绑定附加的插件。

来自元素的官方POM 参考configuration

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

关于节configuration的元素execution

configuration:与上面相同,但将配置限制为这个特定的目标列表,而不是插件下的所有目标。

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

此外,您甚至可以覆盖默认绑定,并通过添加execution相同插件、相同目标、相同执行 id(最重要的一点)并将其附加到不同阶段或不存在的阶段(或空)阶段。因此,您将禁用默认插件目标执行。您还可以使用此技巧将插件目标执行添加为同一阶段的首次执行:通过禁用默认执行,添加您的执行,然后重新定义默认执行(然后使用不同的 id)。然后 Maven 将遵循执行声明顺序。

检查此 SO 答案以了解如何生成执行 ID。这里重要的一点是,来自Maven 官方文档

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