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


Answers:


251

目标是分阶段执行的,有助于确定目标的执行顺序。对此的最佳理解是查看默认的Maven生命周期绑定,该绑定显示默认情况下哪些目标在哪个阶段运行。编译阶段目标将始终在测试阶段目标之前执行,而测试阶段目标将始终在软件包阶段目标之前执行,依此类推。

当您执行Maven时可以指定目标或阶段,这一事实加剧了部分混乱。如果您指定一个阶段,则maven将按顺序运行所有阶段,直到您指定的阶段(例如,如果您指定程序包,它将首先运行编译阶段,然后是测试阶段,最后是程序包阶段),并且对于每个阶段,运行该阶段附加的所有目标。

当您在Maven构建文件中创建插件执行并且仅指定目标时,它将把该目标绑定到给定的默认阶段。例如,默认情况下,jaxb:xjc目标绑定到generate-resources阶段。但是,当您指定执行时,您也可以显式指定该目标的阶段。

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


11
我习惯说“ Maven 通过所有阶段(直到并包括给定的阶段)”,而不是“运行”“执行”(后者在Maven的Build Lifecycle简介中被称为)。这样与实际执行的目标代码更加不同。但这可能是个人喜好。
GeroldBroser恢复了Monica 2015年

但是我们也可以运行不属于任何阶段的目标,即mvn archetype:generate,在这种情况下,maven仅执行目标?
Quazi Irfan

1
@Pace您是否有最后一段的参考?我一直怀疑这一点,用一个简单的项目在这里试了一下:mvn test运行: --- maven-resources-plugin:2.6:resources ... --- maven-compiler-plugin:3.1:compile ... --- maven-resources-plugin:2.6:testResources ... --- maven-compiler-plugin:3.1:testCompile ... --- maven-surefire-plugin:2.12.4:test,而mvn compiler:testCompile只是运行--- maven-compiler-plugin:3.1:testCompile ...
GeroldBroser恢复了莫妮卡

4
@Pace mvn clean compiler:testCompile运行--- maven-clean-plugin:2.5:clean ... --- maven-compiler-plugin:3.1:testCompile失败 Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:testCompile (default-cli) on project mvnphase: Compilation failure ... cannot find symbol ... symbol: variable MvnPhaseMvnPhase测试类中引用了被测类)。显然,如果明确调用目标,则不会调用阶段。
GeroldBroser恢复了莫妮卡

1
根据geroldbroser和@ kekko12的输入,我更新了最后一段,指出当指定目标时,仅运行该目标,而不是之前的所有阶段。
佩斯,

188

生命周期是一系列命名阶段
阶段按顺序执行。执行阶段意味着执行所有先前的阶段。

插件是一个集合的目标也被称为MOJO(中号艾文Ø LD Ĵ AVA Ø bject)。
类比:插件是一类,目标是该类中的方法。

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在你的插件的POM。

构建阶段由插件目标组成

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

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

例如,可以通过运行编译器插件的compile-goal来编译Java项目mvn compiler:compile

构建生命周期是命名阶段的列表,可用于为目标执行指定顺序。

插件提供的目标可以与生命周期的不同阶段关联。例如,默认情况下,目标 compiler:compilecompile 阶段关联,而目标 surefire:testtest 阶段关联。考虑以下命令:

mvn test

当执行前面的命令时,Maven将运行与每个阶段相关的所有目标,直到该阶段为止test。在这种情况下,Maven先运行resources:resourcesprocess-resources阶段关联的目标,然后再运行compiler:compile,依此类推,直到最终运行surefire:test目标。

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

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

mvn clean dependency:copy-dependencies package

如果要执行此步骤,clean则将首先执行该阶段(这意味着它将运行干净生命周期的所有先前阶段,再加上clean阶段本身),然后执行dependency:copy-dependencies目标,然后最终执行该package阶段(及其所有先前的构建阶段)默认生命周期)。

而且,如果目标绑定到一个或多个构建阶段,则在所有这些阶段都将调用该目标。

此外,构建阶段还可以绑定零个或多个目标。如果构建阶段没有目标绑定,则该构建阶段将不会执行。但是,如果绑定了一个或多个目标,它将执行所有这些目标。

内置生命周期绑定
默认情况下,某些阶段将目标绑定到它们。对于默认生命周期,这些绑定取决于包装的价值。

Maven架构:

在此处输入图片说明

参考1
参考2

用于Maven生命周期映射的Eclipse示例

用于Maven生命周期映射的Eclipse示例


如果我有2个配置文件,是否可以先运行配置文件1的所有插件,然后再运行配置文件2的所有插件?
蜜蜂

[plugin-name]在这个例子中mvn [plugin-name]:[goal-name]是一个插件前缀mvn clean install不仅可以“ 在多模块方案中使用 ”。多模块是一个完全不同的主题。
GeroldBroser恢复莫妮卡

同一阶段附加的目标是否遵守任何顺序?
eel ghEEz

5
这些文本大部分都是从Maven文档中逐字复制的。这应该明确说明!
Lii

很棒的消息来源!
Bobo,

45

选择的答案很好,但是我仍然想在主题中添加一些小东西。插图。

它清楚地说明了不同的阶段如何绑定到不同的插件以及这些插件公开的目标。

因此,让我们研究一下运行类似这样的情况mvn compile

  • 这是一个以编译目标执行编译器插件阶段
  • 编译器插件有不同的目标。因为mvn compile它映射到一个特定的目标,即编译目标。
  • 和跑步一样 mvn compiler:compile

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

在此处输入图片说明

链接到参考


20
为什么mvn test指向packagemvn install指向deploy
阿卜杜勒2015年

2
看起来像是插图错误,感谢您的注意(在网络上发现了它)。
约翰尼

3
你从哪里得到插图的?您检查版权和使用条款了吗?
阿卜杜勒2015年

1
@abdull图片从这里拍摄carminespagnuolo.eu/otheractivities/tutorato/PR-2014-2015/…(并且它也出现在许多其他网页上)添加到了答案中。感谢您提出这一点,并没有意识到这一点的重要性。
约翰尼

1
图中从阶段到插件的指针也不完全正确,jar插件实际上在package阶段中运行。阶段和插件之间的pom有点混乱(我认为这意味着在pom中,除了默认绑定之外,您还可以配置哪些插件在哪个阶段中运行)。不过,一般原则是正确的。
亚历山大·克里姆采切克

43

Maven站点的“页面构建生命周期简介”中详细介绍了这些定义,但是我尝试总结一下

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

  1. 生命周期

    三个内置的生命周期(又名构建生命周期): ,default,。clean site生命周期参考

  2. 每个生命周期是由阶段,例如用于default生命周期:compiletestpackageinstall,等。

  3. 插入

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

    根据包装类型(jarwar等),默认情况下,插件的目标绑定到阶段。(内置生命周期绑定

  4. 目标

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

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

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

只有生命周期阶段才有意义,可以将其视为 (构建过程的)“步骤”。我宁愿称其为4个实体/项目/事物
GeroldBroser在2015年

当我看到世界时Build Phase,我将其视为生命周期的另一个阶段,这使我感到困惑。
Quazi Irfan

26

我相信已经提供了一个很好的答案,但我想补充不同的3生命周期(一个易于后续图buildcleansite),并在每个阶段。

在此处输入图片说明

粗体阶段-是常用的主要阶段。


2
generate-resources出现两次并且generate-sources丢失。
elingerojo

12

归功于Sandeep Jindal和Premraj。经过一段时间的困惑,他们的解释帮助我理解了。

我在这里https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/创建了一些完整的代码示例和一些简单的说明。我认为这可能有助于其他人理解。

简而言之,您不应尝试一次理解所有这三个部分,首先应该了解这些组中的关系:

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

1.生命周期与阶段

生命周期是按顺序收集的阶段,请参见此处的生命周期参考。当您调用一个阶段时,它还将调用之前的所有阶段

例如,清洁生命周期分为三个阶段(预清洁,清洁,后清洁)。

mvn clean

它将称为pre-cleanclean

2.插件与目标

目标就像是Plugin中的一个动作。因此,如果plugin是一个类,目标是一种方法。

您可以这样设定目标:

mvn clean:clean

这意味着“在清理插件中调用清理目标”(这里与清理阶段无关。不要让“清理”一词使您感到困惑,因为它们不一样!)

3.现在,阶段与目标之间的关系:

阶段可以(预先)链接到目标。例如,通常,清洁阶段链接到清洁目标。因此,当您调用此命令时:

mvn clean

它将调用预清洁阶段和链接到clean:clean目标的clean阶段。

它几乎与以下内容相同:

mvn pre-clean clean:clean

有关更多详细信息和完整示例,请访问https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/



1

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

  • 默认
  • 清洁
  • 现场

生命周期默认值 -> [验证,初始化,生成源,过程源,生成资源,过程资源,编译,过程类,生成测试源,过程测试源,生成测试资源,过程-test-resources,test-compile,process-test-classes,test,prepare-package,package,pre-integration-test,integration-test,post-integration-test,验证,安装,部署]

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

生命周期站点 -> [站点前,站点,后站点,站点部署]

该流程是顺序的,例如,对于默认生命周期,该流程以validate开头,然后进行初始化等等。

您可以通过启用的调试模式检查生命周期mvnmvn -X <your_goal>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.