【问题标题】:Does the maven validate phase execute as part of the life cycle if there is no custom goal attached to it?如果没有附加自定义目标,Maven 验证阶段是否会作为生命周期的一部分执行?
【发布时间】:2020-04-25 11:45:22
【问题描述】:

如果我运行 maven install 命令,那么它将运行之前的所有阶段。 validatedefault maven 构建生命周期的第一阶段,默认情况下不附加到任何 maven 目标/插件。如果我错了,请纠正我

如果附加了插件/目标,则阶段可以工作。

由于默认情况下验证阶段未附加到任何目标,如果我没有专门挂钩任何自定义目标,例如下面,是否会执行此阶段?

 <build>
    <plugins>
        <plugin>
            <artifactId>maven-clean-plugin</artifactId>
            <version>3.1.0</version>
            <executions>
               <execution>
                   <id>custom-clean</id>
                   <phase>validate</phase>
                   <goals>
                       <goal>clean</goal>
                   </goals>
               </execution>
            </executions>
        </plugin>
</build>

如果它在默认生命周期内执行(没有自定义),那么没有目标的阶段如何工作?

【问题讨论】:

  • 如果没有附加到特定阶段的目标会执行什么?

标签: java maven maven-3 maven-plugin maven-profiles


【解决方案1】:

默认是三个可用的构建生命周期之一,顾名思义,如果没有指定其他生命周期,它会自动考虑构建。 这些构建生命周期由按顺序排列的不同构建阶段列表定义,因此构建阶段代表特定生命周期中的一个阶段。

验证是默认构建生命周期的第一阶段。

如果我们谈论特定于默认生命周期,以下是按以下顺序执行以完成默认构建生命周期的主要阶段: 验证、编译、测试、打包、验证、安装、部署。实际上,默认构建生命周期共有 21 个阶段。

如果我们尝试运行任何特定阶段,它将从验证阶段开始并执行到指定阶段,这直接意味着每当考虑构建默认构建生命周期时,它将始终从验证阶段开始,不是吗'无论您指定哪个阶段。 插件目标不同于构建阶段,它代表有助于构建和管理项目的特定任务。

为了构建或完成构建生命周期,插件目标不是强制性的,但如果存在,它可能绑定到底层生命周期的特定构建阶段,或者它可能不绑定到任何构建阶段。 如果插件目标没有绑定到任何构建阶段,它可以通过直接调用在构建生命周期之外执行,在这种情况下,执行验证阶段没有意义。

此外,默认情况下没有绑定到阶段验证、初始化和验证的插件,其他几个阶段也是如此。

看看 maven 生命周期绑定,它显示了哪些目标默认在哪个阶段运行,例如编译阶段目标将始终在测试阶段目标之前执行。

如果你指定一个阶段,那么 maven 将运行所有阶段,直到我们指定的那个阶段,按顺序,对于每个阶段,它都会运行附加到那个阶段的所有目标。 但是,如果您只指定目标,那么它将将该目标绑定到给定的默认阶段。 但是,当您指定执行时,您也可以明确指定该目标的阶段。

还有一点,如果我们没有为目标指定任何阶段,并且目标没有绑定到任何默认阶段,它将只运行该目标而不会运行其他任何东西。

但是这里有一个问题,如果我们试图只运行特定的目标,并且完成目标中指定的任务所需的构建阶段之前没有执行过,它将失败。 那就是我们会收到错误消息的地方 “未能执行目标……”

一个很好的例子是尝试执行 jar:jar 进行 jar 打包,如果 编译阶段尚未执行,此目标运行将失败,因为 maven 不会将编译好的代码打包为 jar。

更多细节请看here & here

default maven lifecycle bindings

更新:简短回答:不,如果没有定义目标,maven 会绕过一个阶段。

没有目标的阶段只是一个无关紧要的模板。 因为如果没有用户定义的插件目标,默认情况下 mvn validate 什么都不做。 构建阶段由插件目标组成。因为 validate & initialize 没有绑定默认插件。阶段没有目标(包括默认和自定义/指定两者),这意味着阶段什么都不做。 如果您没有声明绑定到验证阶段的插件目标,验证阶段将什么都不做。

您可以涉及另一个场景:当类加载静态成员时,如果没有可用的静态成员,它会跳过该阶段并继续。

【讨论】:

  • 感谢您的回答。但是,我想得到一个具体的是或否的答案。如果我没有在我的 POM 中为 validateinitialize 等阶段定义目标;这些阶段是否由 Maven 执行/运行?如果是,那么说 maven 可以执行没有目标的阶段是否正确?如果否,是否意味着如果没有定义目标,maven 会绕过一个阶段?如果没有在 POM 中定义的自定义插件,我看不到 maven 执行像 validate 这样的阶段(考虑默认生命周期)。
  • 是的,Shailesh。这正是我想确认的。 maven 阶段什么都不做,它只依赖于插件来完成工作。如果未配置插件,则它只是绕过该阶段。谢谢你的澄清。
猜你喜欢
  • 1970-01-01
  • 2014-12-25
  • 1970-01-01
  • 2016-08-05
  • 2016-09-22
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多