java - 如果没有附加自定义目标,maven 验证阶段是否作为生命周期的一部分执行?

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

I have got the above output by running an mvn command help:describe -Dcmd=install

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

The phases works if it has a plugin/goal attached to it.

由于默认情况下验证阶段不附加到任何目标,因此如果我没有专门 Hook 任何自定义目标(如下所示),此阶段是否会执行?

 <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>

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

最佳答案

default 是三个可用的构建生命周期之一,顾名思义,如果没有指定其他生命周期,则会自动将其纳入构建考虑范围。 这些构建生命周期由序列中不同的构建阶段列表定义,因此构建阶段代表特定生命周期中的一个阶段。

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

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

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

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

此外,默认情况下以及其他几个阶段没有绑定(bind)到验证、初始化和验证阶段的插件。

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

如果我们指定一个阶段,那么 maven 将按顺序运行我们指定的该阶段之前的所有阶段,并且对于每个阶段,它将运行附加到该阶段的所有目标。 但如果您只指定目标,那么它将将该目标绑定(bind)到给定的默认阶段。 但是,当您指定执行时,您还可以显式指定该目标的阶段。

还有一件事,如果我们没有为目标指定任何阶段,并且目标没有绑定(bind)到任何默认阶段,那么它将只运行该目标,而不会运行其他任何内容。

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

One good example is trying to execute jar:jar for a jar packaging, if compile phase is not yet executed, this goal run will fail because maven will not get complied code to package as jar.

更多详情请查看here & here

default maven lifecycle bindings

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

没有目标的阶段只是一个没有任何关系的模板。 因为默认情况下,如果没有用户定义的插件目标,mvn validate 不会执行任何操作。 构建阶段由插件目标组成。因为验证和初始化没有绑定(bind)默认插件。某个阶段没有目标(包括默认和自定义/指定两者),这意味着该阶段什么都不做。 如果您没有声明绑定(bind)到验证阶段的插件目标,则验证阶段将不会执行任何操作。

您可以涉及另一种情况:当类加载时寻求加载静态成员时,如果没有可用的静态成员,它将跳过该阶段并继续。

关于java - 如果没有附加自定义目标,maven 验证阶段是否作为生命周期的一部分执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59637395/

相关文章:

java - 如何使用 Java 加密 PDF?

java - Maven 原型(prototype)生成拉更新的或最新的模板

java - maven 3 webapp - 没有要运行的测试?

Java:更改 Float 对象的值

java - 使用 ArrayList 作为值填充 HashTable

java - 是否可以在 JSF 中创建静态枚举对象?

java - 为什么 Maven 看不到 JavaFX 图形模块(而 Eclipse 可以)

java - 如何在 Tomcat 中为 Spring 提供一个类?

java - Selenium "cannot resolve symbol"

git - Maven-scm 插件 : Why is the scmRevision not working as expected?