gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:02:51 24 4
gpt4 key购买 nike

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

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

生命周期阶段目标

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

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

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

最佳答案

If not packing type is defined in a maven pom.xml, jar lifecyle is used.

几乎正确,jar 不是一个生命周期,它是一个包装。 Maven 有三个 build life cycles (clean, default, site) 可以应用于任何包装。

根据官方Maven model

packaging The type of artifact this project produces, for example jar war ear pom. Plugins can create their own packaging, and therefore their own packaging types, so this list does not contain all possible types.
Default value is: jar.


Every maven packaging type has a default build lifecycle

它没有默认的生命周期,你在它的项目上调用默认的生命周期。它有 default bindings对于默认生命周期,也就是说,插件已经根据定义的 packaging 类型默认附加到默认生命周期的阶段。

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

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


While defining a packaging type can we say that is as if the pom.xml plugins section gets populated with the default plugins and goals for that packaging build lifecycle?

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


If we define a plugin in the plugin section, say for example compiler plugin, and give it configurations, do these configuration override the plugin default configurations?

您可以为他们的一个或多个目标定义更多的插件和执行,附加到某个阶段。每个执行 都可以有一个自定义的配置。但是,不在任何执行部分但声明为通用/全局配置的配置将应用于相关插件的任何执行因此也通过包装绑定(bind)默认附加的那些。

来自官方POM referenceconfiguration 元素上

The default behavior is to merge the content of the configuration element according to element name. If the child POM has a particular element, that value becomes the effective value. if the child POM does not have an element, but the parent does, the parent value becomes the effective value.

关于 execution 部分的 configuration 元素:

configuration: Same as above, but confines the configuration to this specific list of goals, rather than all goals under the plugin.

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

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

检查 this SO answer关于如何生成执行 ID。这里的重点是,来自 official Maven documentation

each mojo bound to the build lifecycle via the default lifecycle mapping for the specified POM packaging will have an execution Id of default-goalName assigned to it

关于java - Maven 默认生命周期和插件部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36572018/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com