什么是Maven的目标和阶段,它们有什么不同?

Maven的目标和阶段有什么区别/关系? 他们如何相互关联?

目标是分阶段执行的,这有助于确定执行目标的目标。最好的理解是默认的Maven生命周期绑定 , 默认显示哪些目标在哪个阶段运行。 编译阶段目标将始终在testing阶段目标之前执行,而testing阶段目标将始终在软件包阶段目标等之前执行。

当你执行maven的时候,你可以指定一个目标或一个阶段,从而加剧了部分的混乱。 如果你指定一个阶段,那么Maven将运行所有阶段直到你指定的阶段(例如,如果你指定包,它将首先运行整个编译阶段,然后是testing阶段,最后是包阶段),每个阶段它将运行那个阶段的所有目标。

当你在你的Maven构build文件中创build一个插件执行,并且你只指定了目标,那么它将把这个目标绑定到给定的默认阶段。 例如,jaxb:xjc目标默认绑定到生成资源阶段。 但是,当您指定执行时,您也可以明确指定该目标的阶段。

如果你在执行Maven的时候指定了一个目标,那么它仍然会运行到目标阶段的所有阶段。 换句话说,如果你指定了jar目标,它将运行所有阶段直到包阶段(以及这些阶段中的所有目标),然后运行jar目标。

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

插件是一个目标的集合。
比喻:插件是一个类,目标是类中的方法。

Maven基于构build生命周期的核心概念。
有三个内置的构build生命周期:

  1. 默认
  2. 清洁
  3. 现场

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

例如, default生命周期包含以下构build阶段

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

对于上面的命令,从第一阶段开始,所有的阶段都按顺序执行直到“安装”阶段。 一个命令可以用于多模块schememvn clean install

构build阶段由插件目标组成

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

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

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

构build生命周期是一个命名阶段的列表,可用于命令执行目标。

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

 mvn test 

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

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

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

 mvn clean dependency:copy-dependencies package 

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

而且,如果一个目标必然与一个或多个构build阶段相关联,那么这个目标将在所有这些阶段被调用。

此外,构build阶段还可以有零个或更多的目标绑定到它。 如果构build阶段没有绑定的目标,那么构build阶段将不会执行。 但是,如果它有一个或多个目标绑定,它将执行所有这些目标。

内置的生命周期绑定
有些阶段默认绑定了目标。 而对于默认的生命周期,这些绑定依赖于包装值。

Maven架构:

在这里输入图像说明

参考文献1
参考2

所select的答案很棒,但我仍然想在这个主题上添加一些小东西。 一个例证。

它清楚地展示了不同的阶段绑定到不同的插件和这些插件公开的目标。

那么,让我们来看看运行如mvn compile

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

所以阶段是由插件目标组成的

在这里输入图像说明

链接到参考

这些定义在Maven Site上详细介绍,但是我试图总结一下 :

Maven定义了构build过程的4个“步骤”:

  1. 生命周期 :3个生命周期(aka生命周期) – 默认,清洁,网站。 参考
  2. 构build阶段 :每个生命周期由阶段组成 – 例如,对于默认生命周期:编译,testing,打包,安装等
  3. 插件 :提供一个或多个目标的工件。 基于包装(jar子,战争等),一个插件:目标绑定到一个阶段。 细节
  4. 目标 :执行的任务(行动)。 一个插件可以有一个或多个目标。 在POM中configuration插件时,需要指定目标。 此外,如果插件定义没有默认的构build阶段,则可以使用插件目标指定/绑定阶段。

Maven可以使用以下两种方式(一种或多种的任意一种或两种)进行调用:

  1. 构build阶段(如package
  2. 插件:目标(例如dependency:copy-dependencies

例如mvn clean dependency:copy-dependencies package

感谢Sandeep Jindal和Premraj。 他们的解释有助于我在弄糊涂了一段时间之后才明白。

我在这里https://sites.google.com/site/surasint/maven-life-cycle-easy-explained创build了一些完整的代码示例和一些简单的解释。; 我想这可能会帮助别人理解。

简而言之,你不应该一下子理解所有的三个,首先你应该了解这些群体之间的关系:

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

1.生命周期与阶段

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

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

 mvn clean 

它会叫预清洁清洁

2.插件与目标

目标就像插件中的一个动作。 所以如果插件是一个类,目标是一种方法。

你可以像这样调用一个目标:

 mvn clean:clean 

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

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

阶段可以(预)链接到目标 (S)。例如,通常,清洁阶段链接到干净的目标。 所以,当你调用这个命令时:

 mvn clean 

它将把预清洁阶段和清洁阶段称为清洁目标。

它几乎是一样的:

 mvn pre-clean clean:clean 

有关详细信息和完整示例, 请参阅https://sites.google.com/site/surasint/maven-life-cycle-easy-explained

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

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

例如: – 如果你运行mvn干净

这是执行目标mvn clean:clean的阶段

目标:Maven的目标与阶段

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