Maven:生命周期vs.阶段vs.插件vs.目标

这里相对较新的开发者,即使我已经使用了一段时间,我希望巩固我的Maven基础。 我的问题的一部分是,我没有与ant的经验,这似乎是从哪里来的许多解释干。 我一直在阅读和看教程,我一直听到相同的条款:

  • 生命周期
  • 插入
  • 目标

从我所了解到的情况来看,生命周期似乎是最广泛的,由阶段,插件和/或目标组成(或完成)。

问题 :你能提供关于这些术语如何相关的最常见的例子吗?

越明确和基本越好!

@ Drejc的答案是不完整的。

尤其是:

每个阶段都可以有一个目标, 在事后阶段之前或之后运行,例如:

预安装 – …
后期包装 – …

如果您愿意,您可以将目标视为额外的“插入”阶段。

[我的错误陈述的删除]

Maven生命周期是一个(抽象的)概念,涵盖所有步骤 (或者更好的:Mavendevise者决定支持的所有步骤) ,这些步骤预计将在项目的开发生命周期中发生。 这些步骤(或阶段)在Maven术语中被称为阶段

Maven插件目标的容器/供应商 实现目标的代码是真正的主力。 ( Maven的核心本身就是pipe理插件和执行目标 )。 每个插件的目标都可以分配/绑定到任何生命周期阶段。

当调用mvn <phase> Maven会通过所有阶段 (每次), 并执行所有 已经绑定到任何阶段的 所有目标 (由插件提供) ,并且一直到(包括)给定阶段。 如果有一个没有目标的阶段,那么什么都不做。 但是阶段通过了。

也就是说,您不能将额外的阶段插入到Maven的内置生命周期中。 他们已经在那里,总是! 你可以用自己的阶段来开发你自己的生命周期,但是这远远不能简单地使用Maven。

称为“预安装”“后包装”的阶段不存在。

参考文献:

  • Maven,构build生命周期介绍
    如果你想知道Maven如何在POM中没有任何目标绑定的情况下知道该怎么做,那么在位于<Your Maven installation>/lib/maven-core-xyzjar/META-INF/plexus/default-bindings.xml的末尾有一个到default-bindings.xml的链接<Your Maven installation>/lib/maven-core-xyzjar/META-INF/plexus/default-bindings.xml

  • Maven:完整的参考资料,第4章,构build生命周期

  • Maven by Example,3.5。 核心概念

Maven:生命周期vs.阶段vs.插件vs.目标

为了澄清这个线程中缺less的另一个粒度级别,回答迟了一点: 执行 (目标)是Maven构build的最小单元。

因此,我们有构build循环 (基本上是针对特定总体目标的动作集),它由阶段 (较低粒度,一个循环步骤)组成,它可以调用由某些插件提供的一组configuration目标 。 也就是说,Maven(也)是一个插件执行器,每个插件可以提供一个或多个目标。 然后你(也)决定哪一个目标附属于低阶生命周期中的大部分时间(没有任何,即缺省)。 但实际上你可能还有另一个层次:执行(来自同一个插件的相同目标,或来自不同插件的不同目标)

我准备恢复整个的图片 在这里输入图像描述

事实上,Maven如何通过构build日志中的唯一string来显示它(最小的工作单元):

 plugin-artifactId:plugin-version:plugin-goal (goal-execution-id) @ project-name 

例如,我们会有:

 [INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ sample-project --- 

这确实意味着(通过不同级别的粒度):

  • compile阶段(不幸的是,不幸的是)>
  • 我正在调用Maven Compiler插件( artifactIdversion )>
  • 我正在调用它的compile目标>
  • 如由default-compile执行所定义的

这是唯一的,因为实际上你可以有相同的目标(同一个插件)绑定到不同的阶段或相同的阶段,但在不同的执行(即不同的configuration)。 例如, maven-compiler-plugin也在test-compile阶段 (一个不同的阶段)使用不同的执行( default-testCompile )来编译testing代码(通过它的testCompile目标)。 您也可以在不同的阶段编译(使用相同的插件和目标)一些自动生成的代码,这些阶段由您在POM中指定的执行(可能是不同的configuration)定义。

默认的执行是通过Maven包装绑定来实现的 ,也就是说,默认情况下(和强制执行约定而不是configuration)Maven已经在某些阶段调用了某些特定的目标(标准插件)。 这些默认调用的执行ID是按照一定的惯例来定义的。

这也解释了为什么如果你真的想重写一个Maven构build的默认行为(绑定),你需要在你的POM中为同一个插件指定(覆盖)完全相同的执行ID。 例如,你可以跳过编译,只是用相同的default-compile标识定义一个maven-compiler-plugin的执行,但绑定到一个不存在的阶段(或一个空的阶段)。

简而言之 :一个执行告诉Maven哪个目标在哪个阶段被执行。

默认情况下提供了一些执行(默认绑定),这就解释了为什么只有6行的maven最小的pom可以做很多事情(编译,testing,包等):在某些阶段执行标准插件的目标:组态。 然后,通过pom.xmlconfiguration,你可以添加东西 (执行)到构build或影响已经configuration的插件的行为(在这种情况下没有executions部分,但只是configuration就足够了)。

是的,你可以跳过构build周期(和他们的阶段),并直接调用目标(插件)。 想象一下:

 mvn compiler:compile mvn compiler:testCompile mvn surefire:test mvn jar:jar 

(注意:你也可以在一个调用中内联调用)

在这里,我们正在编译应用程序代码,testing代码,执行testing和打包:想象如何手动,容易出错,重复和耗时。 约定优于configuration有助于我们:Maven介绍构build生命周期和阶段 。 默认的生命周期(没有名字,也就是默认),根据最佳实践和约定(Maven的口头禅)提供了一系列阶段。
如果你想达到上述目的,只需运行: mvn package ,它会自动编译,testing和打包你的项目。 怎么样? 调用插件。 也就是说,阶段是有意义且可configuration的一组插件(目标)执行。 为了使它更加标准,Maven将在每个阶段首先调用任何上一个阶段,例如,如果你想testing你将确保你首先编译。

ps注意,当为同一个execution指定几个目标时,你仍然可以在构build日志中清楚地看到两个不同的目标(因此,仍然是唯一的元组)的两个不同的执行(具有相同的ID)。

感谢Sandeep Jindal和Premraj(来自这里) 什么是Maven的目标和阶段,它们有什么不同? 他们的解释帮助我理解。

我在这里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 

所以这里稍后解释一下

Maven构build在生命周期中是分裂的:

  • 清洁
  • build立(默认)
  • 现场

每个周期都分成几个阶段。 例如,构build分为几个阶段:

  • 准备资源
  • 安装

阶段的目标是在事后阶段之前或之后运行,例如:

  • 预清理 – 将在清理阶段之前执行
  • 清洁后 – 将在清洁阶段后执行

如果您愿意,您可以将目标视为额外的“插入”阶段。 在这里阅读或看看@Gerolds答案的细节。

资料来源: http : //www.codetab.org/apache-maven-tutorial/ ,这是一个很好的教程

生命周期,生命周期阶段,插件和插件目标是Maven的核心。

  • Maven命令mvn只能接受生命周期阶段或插件目标作为参数。
  • Maven有三个生命周期 – 默认,清洁和站点。
  • 每个生命周期由生命周期阶段组成 ,总共有28个阶段 – 默认21validation,…,编译,…,包装,…,安装,部署 ), 清洁3预清理,干净,后清洁 )和站点4站点 前,站点,站点后,站点部署 )。
  • 当使用mvn命令调用生命周期阶段时,所有前面的阶段都会依次执行。
  • 生命周期阶段本身没有任何能力来完成一些任务,他们依靠插件来完成任务。
  • 取决于项目和包装types, Maven将不同的插件目标绑定到生命周期阶段和目标,从而完成委托给他们的任务。

当我们在Java项目中运行“ mvn package ”时,Maven将插件目标绑定到生命周期阶段,如下图所示。

MVN-插件包,目标

还有另一张图

  • 生命周期为黄色矩形
  • 生命周期阶段为蓝色矩形,“深蓝色”的“可调用”阶段。
  • 目标蓝色锭剂。 所显示的关联“阶段 – >目标”是“瓶子” 包装模式之一
  • 插件为灰色修剪的矩形。

在这里输入图像描述

LifeCycle vs阶段: Life Cycle是一个phases的集合。 当你调用一个阶段时,它也会调用它之​​前的所有阶段。 Maven具有3个内置构build生命周期,如下所示:

  1. 清洁生命周期 – 这涉及项目的清理(用于新build和部署)
  2. 默认/构build生命周期 – 这将处理项目的完整部署
  3. 网站生命周期 – 这处理生成项目的Java文档。 在这里输入图像描述

清洁生命周期有三个阶段:预清理,清理和后清理。 默认和网站生命周期的阶段是相同的,如图所示。

插件与目标:在Maven框架中提供的某些插件负责执行各自的操作(目标),比如编译compiler插件“编译”和“testing编译”目标。 同样install插件负责执行“安装”的目标。

目标是你在上图中看到的阶段。 目标表示您希望Maven执行的特定操作。 当你必须执行特定的目标时,你将阶段名称写成“目标”。