Maven:生命周期与阶段与插件与目标的对比

时间:2014-10-28 12:01:03

标签: maven maven-3 pom.xml maven-lifecycle

这里相对较新的开发人员,即使我已经使用了一段时间,我也希望能够巩固我的Maven基础知识。我的部分问题是我对Ant有没有的经验,这似乎是许多解释的源头。我一直在阅读和观看教程,我一直听到相同的条款:

  • 生命周期
  • 相位
  • 插件
  • 目标

从我所学到的知识来看,生命周期似乎是最广泛的,并且由阶段,插件和/或目标组成(或完成)。

问题:您能否提供有关这些术语如何相关以及最常见示例的任何信息?

越明确,越基本越好!

7 个答案:

答案 0 :(得分:63)

@Drejc's answer并不完全正确。

特别是:

  

每个阶段的目标都是在一个阶段之前或之后运行,例如:
  
  预安装 - ...
  包装后 - ...
  
   您可以将目标视为额外的"插入"你喜欢的阶段。

[我的错误言论的删除。]

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

Maven插件目标的供应商的容器。目标中实现的代码是真正的主力。 (Maven in its core itself is just managing plugins and executing goals)。 每个插件的目标都可以分配/绑定到任何生命周期阶段。

当调用mvn <phase> Maven通过所有阶段(每次)并执行已绑定到任何目标的所有目标(由插件提供)阶段之前和之前(包括)给定阶段。如果有一个阶段没有绑定目标,则不会做任何事情。但是这个阶段仍然存在。

即。你不能&#34;&#39;插入&#39;其他阶段&#34; 进入Maven的内置生命周期之一。他们已经在那里了!你可以用自己的阶段开发自己的生命周期,但这远不仅仅是简单地使用Maven。

阶段名为&#34;预安装&#34; &#34; post-package&#34; 不存在。

参考文献:

答案 1 :(得分:40)

  

Maven:生命周期与阶段与插件与目标的对比

为了澄清此线程中缺少的另一个粒度级别,我很晚才回答:执行(目标),这是Maven构建的最小单位。

因此,我们有构建周期(基本上,针对特定总体目标的一组操作),其由阶段(较低粒度,循环步骤)组成,其中可以调用某些插件提供的一组已配置的目标。也就是说,Maven(也是)一个插件执行器,每个插件都可以提供一个或多个目标。然后你(也)确定哪个目标附加到哪个阶段,大多数时间都在默认生命周期中(没有任何,即默认值)。但你实际上可以有另一个级别:执行(相同目标,来自同一个插件,或来自不同插件的不同目标)

我准备恢复整体的图片 enter image description here

事实上,这就是Maven通过其构建日志中的唯一字符串显示它(最小的工作单元)的方式:

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

例如,我们会:

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

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

  • compile阶段(未提及,不幸的是)&gt;
  • 我正在调用Maven编译器插件(artifactIdversion)&gt;
  • 我正在调用compile目标&gt;
  • default-compile执行
  • 定义

它是独一无二的,因为实际上你可以有相同的目标(相同的插件)绑定到不同的阶段或相同的阶段但是在不同的执行中(即,使用不同的配置)。例如,maven-compiler-plugin也在test-compile phase(不同阶段)期间用于在不同的执行中编译测试代码(通过其testCompile目标)(default-testCompile) 。您还可以在POM中指定的执行(可能是不同的配置)定义的不同阶段编译(使用相同的插件和目标)一些自动生成的代码。

默认执行是通过Maven packaging bindings开箱即用的,即默认情况下(并强制执行约定)Maven在某些阶段已经调用某些目标(标准插件)。这些默认调用的执行ID是根据certain conventions定义的。

这也解释了为什么如果你真的想要覆盖Maven构建的默认行为(绑定),你需要在POM中为同一个插件指定(覆盖)完全相同的执行id。例如,您可以跳过编译,只是简单地定义具有相同maven-compiler-plugin id的default-compile的执行,但绑定到非现有阶段(或空阶段)。

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

默认情况下会提供一些执行(默认绑定),这解释了为什么 6 行的maven minimal pom已经可以做很多事情(编译,测试,打包等):在某些阶段执行标准插件的目标:它是对配置的约定。然后,通过pom.xml配置,您可以将 stuff (执行)添加到构建中或影响已配置插件的行为(在这种情况下没有executions部分,但只是{ {1}}就足够了。

是的,您可以跳过构建周期(及其阶段)并直接调用(插件的)目标。想象一下:

configuration

(注意:你也可以只在一次通话中调用内联)

这里我们正在编译应用程序代码,测试代码,执行测试和打包:想象一下这将是多么手动,容易出错,重复和耗时。约定优于配置有助于我们:Maven引入构建生命周期和阶段。默认生命周期(没有名称,即默认生命周期)根据最佳实践和约定(Maven的口头禅)提供了一系列阶段。
如果你想实现与上面相同的功能,只需运行:mvn compiler:compile mvn compiler:testCompile mvn surefire:test mvn jar:jar ,它将自动编译,测试和打包你的项目。怎么样?调用插件。也就是说,阶段是有意义且可配置的插件(目标)执行集。为了使其更加标准化,对于每个阶段,Maven将首先调用任何前一阶段,以便例如如果你想测试你,请确保你先编译。

P.S。请注意,在为同一个mvn package指定多个目标时,您仍会在构建日志中清楚地看到两个不同的目标(具有相同的ID),因此两个不同的目标(因此,仍然是唯一的元组)。

答案 2 :(得分:15)

归功于Sandeep Jindal和Premraj(来自What are Maven goals and phases and what is their difference?)。他们的解释帮助我理解。

我创建了一些完整的代码示例&amp;这里有一些简单的解释https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/。我认为这可能有助于其他人理解并可以直接尝试。

简而言之,您不应该尝试同时理解所有三个,首先您应该了解这些群体中的关系:

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

<强> 1。生命周期与阶段

生命周期按顺序是阶段的集合,请参阅此处Life Cycle References。当您拨打阶段时,它也会调用之前的所有阶段

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

mvn clean

它会调用预清洁清理

<强> 2。插件与目标

目标就像插件中的操作一样。因此,如果插件是一个类,则目标是一种方法。

你可以这样打个目标:

mvn clean:clean

这意味着“在干净的插件中调用干净的目标”(这里没有任何关于干净的阶段。不要让“干净”这个词让你感到困惑,它们不一样!请参阅上面链接中的完整说明)

第3。现在Phase&amp;的关系目标

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

mvn clean

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

几乎与:

相同
mvn pre-clean clean:clean

答案 3 :(得分:11)

姗姗来迟的另一张图

  • 生命周期为黄色矩形
  • 生命周期的
  • 阶段为蓝色矩形 "callable"阶段呈深蓝色(即通常不会从命令行调用具有夸张的阶段,因为它们可能不会被设计为使项目处于明确定义的状态)。
  • 目标为蓝色含片。显示的关联/绑定“阶段 - &gt;目标”是“jar”打包模式之一。每个阶段都可以有目标。这当然适用于每个生命周期,尽管绑定仅针对“默认”生命周期显示。
  • 插件为灰色剪裁的矩形。插件提供了可以绑定到阶段的目标。

Maven Lifecycles, Phases, Goals, Plugins

答案 4 :(得分:10)

来源:http://www.codetab.org/apache-maven-tutorial/,这是非常好的教程

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

  • Maven命令 mvn 只能接受生命周期阶段或插件目标作为参数。
  • Maven带有三个生命周期 - 默认,干净和网站。
  • 每个生命周期都由生命周期阶段组成,总共有28个阶段 - 默认21 验证,...,编译,... 。,包,......,安装,部署),清理3 预清洁,清洁,后清理)和网站4 pre-site,site,post-site,site-deploy )。
  • 当使用mvn命令调用生命周期阶段时,所有前面的阶段将一个接一个地顺序执行。
  • 生命周期阶段本身没有任何完成某项任务的能力,他们依靠插件来执行任务。
  • 根据项目和包装类型, Maven将各种插件目标绑定到生命周期阶段,目标执行委托给他们的任务。

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

mvn-plugins-package-goal

答案 5 :(得分:7)

所以按照概述here

进一步解释

Maven版本在生命周期中分为以下几种:

  • 清洁
  • 构建(默认)
  • 位点

每个周期都分为几个阶段。 例如,构建分为以下阶段:

  • 准备资源
  • 编译
  • 安装

阶段的目标是先前前 - 阶段之后,例如:

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

如果您愿意,可以将目标视为额外的“插入”阶段。 阅读here或查看@Gerolds answer了解详情。

答案 6 :(得分:3)

LifeCycle vs阶段: Life Cyclephases的集合。当你调用一个阶段时,它也会调用它之​​前的所有阶段。 Maven带有3个内置构建生命周期:

  1. 清洁生命周期 - 这涉及清理项目(用于新建和部署)
  2. 默认/构建生命周期 - 它处理项目的完整部署
  3. 站点生命周期 - 它处理生成项目的java文档。 enter image description here
  4. 清洁生命周期有三个阶段:预清洁,清洁和后清洁。默认和网站生命周期&#39;阶段与图片中显示的相同。