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插件(
artifactId
和version
)> - 我正在调用它的
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.xml
configuration,你可以添加东西 (执行)到构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个阶段 – 默认21 ( validation,…,编译,…,包装,…,安装,部署 ), 清洁3 ( 预清理,干净,后清洁 )和站点4 ( 站点 前,站点,站点后,站点部署 )。
- 当使用mvn命令调用生命周期阶段时,所有前面的阶段都会依次执行。
- 生命周期阶段本身没有任何能力来完成一些任务,他们依靠插件来完成任务。
- 取决于项目和包装types, Maven将不同的插件目标绑定到生命周期阶段和目标,从而完成委托给他们的任务。
当我们在Java项目中运行“ mvn package ”时,Maven将插件目标绑定到生命周期阶段,如下图所示。
还有另一张图
- 生命周期为黄色矩形
- 生命周期阶段为蓝色矩形,“深蓝色”的“可调用”阶段。
- 目标蓝色锭剂。 所显示的关联“阶段 – >目标”是“瓶子” 包装模式之一 。
- 插件为灰色修剪的矩形。
LifeCycle vs阶段: Life Cycle
是一个phases
的集合。 当你调用一个阶段时,它也会调用它之前的所有阶段。 Maven具有3个内置构build生命周期,如下所示:
- 清洁生命周期 – 这涉及项目的清理(用于新build和部署)
- 默认/构build生命周期 – 这将处理项目的完整部署
- 网站生命周期 – 这处理生成项目的Java文档。
清洁生命周期有三个阶段:预清理,清理和后清理。 默认和网站生命周期的阶段是相同的,如图所示。
插件与目标:在Maven框架中提供的某些插件负责执行各自的操作(目标),比如编译compiler
插件“编译”和“testing编译”目标。 同样install
插件负责执行“安装”的目标。
目标是你在上图中看到的阶段。 目标表示您希望Maven执行的特定操作。 当你必须执行特定的目标时,你将阶段名称写成“目标”。