Maven的目标和阶段是什么?它们的区别是什么?

Maven目标和阶段之间的区别/关系是什么?它们之间有什么关系?

302544 次浏览

目标是分阶段执行的,这有助于确定目标执行的顺序。最好的理解是看缺省Maven生命周期绑定,它显示了默认情况下哪个目标在哪个阶段运行。compile阶段目标总是在test阶段目标之前执行,而test阶段目标总是在package阶段目标之前执行,以此类推。

执行Maven时可以指定目标或阶段,这在一定程度上加剧了这种混乱。如果您指定了一个阶段,那么Maven将运行所有阶段,直到您指定的阶段(例如,如果您指定了包,它将首先运行编译阶段,然后是测试阶段,最后是包阶段),并且对于每个阶段,它将运行与该阶段相关的所有目标。

当您在Maven构建文件中创建插件执行时,如果您只指定了目标,那么它就会将该目标绑定到给定的默认阶段。例如,jaxb:xjc目标默认绑定到generate-resources阶段。但是,当您指定执行时,您还可以显式地指定该目标的阶段。

如果您在执行Maven时指定了一个目标,那么它将运行该目标,且仅运行该目标。换句话说,如果你指定了jar:jar目标,它只会运行jar:jar目标来将你的代码打包到一个jar中。如果您之前没有运行编译目标或以其他方式准备编译后的代码,则很可能会失败。

具有阶段和目标的Maven工作术语。

阶段:Maven阶段是一组与2或3个目标相关的行动

示例:-如果您运行MVN清洁

这是MVN阶段要执行的清洁目标:清洁

目标:与阶段有界限的Maven目标

< p >供参考 http://books.sonatype.com/mvnref-book/reference/lifecycle-sect-structure.html < / p >

定义在Maven站点的页面构建生命周期介绍中有详细说明,但我已经尝试总结:

Maven定义了构建过程的4项:

  1. < p > 生命周期

    三个内置生命周期(又名建立生命周期): defaultcleansite。(生命周期参考) < / p >

  2. < p > 阶段

    每个生命周期都由阶段组成,例如,对于default生命周期:compiletestpackageinstall

  3. < p > 插件

    提供一个或多个目标的工件。

    基于打包类型(jarwar等),插件的目标默认绑定到阶段。(内置生命周期绑定) < / p >

  4. < p > 目标

    执行的任务(动作)。一个插件可以有一个或多个目标。

    在POM中配置插件. 0时,需要指定一个或多个目标。此外,如果插件没有定义默认阶段,则可以将指定的目标绑定到一个阶段

Maven可以通过以下方式调用:

  1. 一个阶段(例如cleanpackage)
  2. <plugin-prefix>:<goal>(例如dependency:copy-dependencies)
  3. <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>(例如org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile)

混合的:任意或全部的一个或多个组合,例如:

mvn clean dependency:copy-dependencies package

选择的答案很好,但我仍然想为这个话题补充一些小的东西。一个例证。

它清楚地展示了不同的阶段如何绑定到不同的插件以及这些插件暴露的目标。

因此,让我们检查一个运行类似mvn compile的例子:

  • 它是一个阶段,用于执行编译器插件 李编译目标 < / >
  • 编译器插件有不同的目标。对于mvn compile,它被映射到一个特定的目标,编译目标。
  • 这和运行mvn compiler:compile是一样的

因此,阶段由插件目标组成

enter image description here

链接到参考

生命周期是一个名为阶段的序列 phase按顺序执行。

.执行一个阶段意味着执行之前所有阶段

Plugin是目标的集合,也称为MOJO (aven Old Java Object) 类比:Plugin是一个类,而目标是类中的方法。< / p >

Maven是基于构建生命周期的核心概念。在每个构建生命周期中有构建阶段,在每个构建阶段中有建立目标

我们可以执行构建阶段或构建目标。当执行一个构建阶段时,我们执行该构建阶段中的所有构建目标。构建目标被分配到一个或多个构建阶段。我们也可以直接执行一个构建目标。

有三个主要的内置构建生命周期:

  1. 默认的
  2. 清洁
  3. 网站

每个构建生命周期由阶段组成

例如,default生命周期由以下构建阶段组成:

◾validate - validate the project is correct and all necessary information is available
◾compile - compile the source code of the project
◾test - test the compiled source code using a suitable unit testing framework. These tests should not require the code be packaged or deployed
◾package - take the compiled code and package it in its distributable format, such as a JAR.
◾integration-test - process and deploy the package if necessary into an environment where integration tests can be run
◾verify - run any checks to verify the package is valid and meets quality criteria
◾install - install the package into the local repository, for use as a dependency in other projects locally
◾deploy - done in an integration or release environment, copies the final package to the remote repository for sharing with other developers and projects.

为了完成以上阶段,我们只需要调用一个命令:

mvn <phase> { Ex: mvn install }

对于上述命令,从第一阶段开始,依次执行所有阶段,直到“安装”阶段。mvn可以执行一个目标或一个阶段(甚至多个目标或多个阶段),如下所示:

mvn clean install plugin:goal

然而,如果你想自定义引用你的插件的前缀,你可以直接通过你的插件的砰的一声。中的maven-plugin-plugin的配置参数来指定前缀

构建阶段由< A href="https://maven.apache.org/plugins/index.html" rel="noreferrer">Plugin Goals组成

Maven的大部分功能都在插件中。插件提供了一组目标,可以使用以下语法执行:

 mvn [plugin-name]:[goal-name]

例如,可以通过运行mvn compiler:compile来使用编译器插件的编译目标来编译Java项目。

构建生命周期是一个已命名阶段的列表,可用于为目标执行提供顺序。

例如,默认情况下,目标 compiler:compilecompile 阶段相关联,而目标 surefire:testtest 阶段相关联。考虑以下命令:

mvn test

当执行上面的命令时,Maven将运行与test阶段之前和包括test阶段在内的每个阶段相关的所有目标。在这种情况下,Maven运行与process-resources阶段相关联的resources:resources目标,然后运行compiler:compile,以此类推,直到最终运行surefire:test目标。

然而,即使构建阶段负责构建生命周期中的特定步骤,它执行这些职责的方式也可能不同。这是通过声明与这些构建阶段绑定的插件目标来实现的。

一个插件目标代表了一个特定的任务(比构建阶段更精细),它有助于项目的构建和管理。它可以绑定到零或多个构建阶段。不绑定到任何构建阶段的目标可以通过直接调用在构建生命周期之外执行。执行的顺序取决于目标和构建阶段被调用的顺序。例如,考虑下面的命令。cleanpackage参数是构建阶段,而dependency:copy-dependencies是(插件的)目标。

mvn clean dependency:copy-dependencies package

如果要执行这个,将首先执行clean阶段(这意味着它将运行清洁生命周期的所有前面阶段,加上clean阶段本身),然后是dependency:copy-dependencies目标,最后执行package阶段(以及默认生命周期的所有前面构建阶段)。

此外,如果一个目标被绑定到一个或多个构建阶段,那么该目标将在所有这些阶段中被调用。

此外,构建阶段也可以有零个或多个目标。如果构建阶段没有与之绑定的目标,那么该构建阶段将不会执行。但如果它有一个或多个目标,它就会执行所有这些目标。

< p > 内置生命周期绑定 < br > 有些阶段默认有目标。对于默认的生命周期,这些绑定依赖于打包值

Maven架构:

enter image description here

< p > 参考1 < br > 参考2 < / p >

Maven生命周期映射的Eclipse示例

Eclipse sample for Maven Lifecycle Mapping

归功于Sandeep Jindal和Premraj。我一时糊涂,他们的解释让我明白了。

我创建了一些完整的代码示例&这里有一些简单的解释。我想这可以帮助别人理解。

简而言之,你不应该试图一次理解所有这三个组,首先你应该理解这三个组之间的关系:

  • 生命周期vs阶段
  • 插件vs目标

1. 生命周期vs阶段

生命周期阶段按顺序的集合,参见这里的生命周期参考。当你调用阶段对象时,它也会调用它之前的所有阶段对象。

例如,清洁生命周期有3个阶段(预清洁,清洁,后清洁)。

mvn clean

它将调用pre-clean清洁

2. 插件vs目标

目标类似于插件中的一个动作。如果plugin是一个类,goal是一个方法。

你可以这样称呼一个进球:

mvn clean:clean

这意味着“在清洁插件中调用清洁目标”(这里与清洁阶段无关。不要让“干净”这个词混淆了你,它们不是一样的!)

3.现在相位和amp的关系;目标:

阶段可以(预)链接到目标(s)。例如,通常,清洁阶段与清洁目标相关联。所以,当你调用这个命令时:

mvn clean

它将调用预清洁阶段和清洁阶段,后者与清洁目标相关联。

它几乎等同于:

mvn pre-clean clean:clean

更多细节和完整的例子在https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/

有以下三个内置的构建生命周期:

  • 默认的
  • 清洁
  • 网站

生命周期默认 ->[验证,初始化,生成-源,过程-源,生成-资源,过程-资源,编译,过程-类,生成-测试-源,过程-测试-源,生成-测试-资源,过程-测试-资源,测试-编译,过程-测试-类,测试,准备-包,包,预集成测试,集成测试,后集成测试,验证,安装,部署]

生命周期清洁 ->[预清洁,清洁,后清洁]

生命周期的网站 -> [pre-site, site, post-site -deploy]

流是顺序的,例如,对于默认的生命周期,它从验证开始,然后初始化等等…

你可以通过启用mvn的调试模式来检查生命周期,即mvn -X <your_goal>

我相信已经提供了一个很好的答案,但我想添加一个易于理解的3个不同生命周期(buildcleansite)及其阶段的图表。

enter image description here

粗体的相位是常用的主要相位。

参考Pace的回答

如果您在执行Maven时指定了一个目标,那么它将运行该目标,且仅运行该目标。换句话说,如果您指定了jar:jar目标,它将只运行jar:jar目标来将您的代码打包到一个jar中。

这种说法有一个例外。Maven插件API允许目标触发生命周期阶段的执行。

考虑以下项目:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>simple-maven-project</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
</project>

当你执行在spring-boot-maven-plugin中定义的目标run

mvn org.springframework.boot:spring-boot-maven-plugin:run

它打印

[INFO] ------------------< org.example:simple-maven-project >------------------
[INFO] Building simple-maven-project 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] >>> spring-boot-maven-plugin:3.0.0:run (default-cli) > test-compile @ simple-maven-project >>>
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ simple-maven-project ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory C:\Users\Bartosz\IdeaProjects\simple-maven-project\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ simple-maven-project ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ simple-maven-project ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory C:\Users\Bartosz\IdeaProjects\simple-maven-project\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ simple-maven-project ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] <<< spring-boot-maven-plugin:3.0.0:run (default-cli) < test-compile @ simple-maven-project <<<
[INFO]
[INFO]
[INFO] --- spring-boot-maven-plugin:3.0.0:run (default-cli) @ simple-maven-project ---
[INFO] ------------------------------------------------------------------------

这是因为spring-boot-maven-plugin-X.X.X.jar / meta - inf / maven / plugin . xml中的目标定义包含<executePhase>test-compile</executePhase>,它执行test-compile和所有前面的阶段。

<mojo>
<goal>run</goal>
(...)
<executePhase>test-compile</executePhase>
(...)
</mojo>

此外,由于默认的绑定为“jar”;包装,很少执行其他目标。如果将包装更改为"pom",则相同的命令结果为

[INFO] ------------------< org.example:simple-maven-project >------------------
[INFO] Building simple-maven-project 1.0-SNAPSHOT
[INFO] --------------------------------[ pom ]---------------------------------
[INFO]
[INFO] >>> spring-boot-maven-plugin:3.0.0:run (default-cli) > test-compile @ simple-maven-project >>>
[INFO]
[INFO] <<< spring-boot-maven-plugin:3.0.0:run (default-cli) < test-compile @ simple-maven-project <<<
[INFO]
[INFO]
[INFO] --- spring-boot-maven-plugin:3.0.0:run (default-cli) @ simple-maven-project ---
[INFO] ------------------------------------------------------------------------

因为对于test-compile或任何之前的阶段和此打包类型没有默认绑定。