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

2024-03-06

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

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

生命周期阶段目标

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

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

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


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

几乎正确,jar不是生命周期,而是包装。 Maven 有three 构建生命周期 https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html(干净、默认、站点)可应用于任何包装。

据官方介绍Maven模型 https://maven.apache.org/ref/3.2.5/maven-model/maven.html

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


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

它没有默认的生命周期,您可以在其项目上调用默认的生命周期。它有默认绑定 https://maven.apache.org/ref/3.3.9/maven-core/default-bindings.html对于默认生命周期,即插件已经根据定义默认附加到默认生命周期的各个阶段packaging type.

中的一个核心概念 https://maven.apache.org/background/philosophy-of-maven.htmlMaven 是约定优于配置。它的默认绑定强制执行这一原则,已经为给定的包提供了某些插件的某些目标的执行。
例如,默认情况下已经需要编译(通过maven-compiler-plugin和它的compile期间的目标compile阶段),测试(通过maven-surefire-plugin和它的test期间的目标test阶段)和包(通过maven-jar-plugin和它的jar期间的目标package阶段)应用默认值时的项目(jar) 包装。
(注意模式:我提到了一个插件、一个目标、一个阶段,即默认绑定)。

这就是为什么最小的 pom https://maven.apache.org/guides/introduction/introduction-to-the-pom.html#Minimal_POM已经可以做很多事情了:同样,它是约定优于配置。


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

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


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

您可以定义更多插件和executions他们的一个或多个目标,附加到某个阶段。每个execution可以定制configuration。然而,一个configuration不属于任何execution但声明为通用/全局配置的部分将应用于任何执行相关插件的名称以及默认通过打包绑定附加的插件的名称。

来自官方POM参考 https://maven.apache.org/pom.html#Plugins on the configuration element

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

并关于configuration的元素execution部分:

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

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

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

Check 这个答案 https://stackoverflow.com/a/34599117/5606016关于如何生成执行 ID。这里重要的一点是,从官方 Maven 文档 https://maven.apache.org/guides/mini/guide-default-execution-ids.html

通过指定 POM 打包的默认生命周期映射绑定到构建生命周期的每个 mojo 将具有一个执行 IDdefault-goalName分配给它

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Maven 默认生命周期和插件部分 的相关文章

随机推荐