117

这里相对较新的开发人员,尽管我已经使用了一段时间,但我希望巩固我的 Maven 基础。我的部分问题是我没有使用 Ant 的经验,这似乎是许多解释的根源。我一直在阅读和观看教程,并且不断听到相同的术语:

  • 生命周期
  • 阶段
  • 插入
  • 目标

据我所知,生命周期似乎是最广泛的,由阶段、插件和/或目标组成(或由其完成)。

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

越明确和基本越好!

4

7 回答 7

82

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

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

调用mvn <phase> Maven时(每次)都会通过所有阶段并执行所有目标(由插件提供),这些目标已绑定到给定阶段之前和(包括)给定阶段之前的任何阶段。如果有一个没有目标绑定的阶段,则什么也做不了。但是这个阶段还是过去了。

即你不能“'插入'附加阶段”到 Maven 的内置生命周期之一。他们已经在那里,永远!您可以使用自己的阶段来开发自己的生命周期,但这远远超出了简单地使用 Maven 的范围。

目标也可以直接执行,当你在mvn没有任何阶段或(插件:)目标的情况下运行时会被告知[这里有换行符和缩短的可读性]:

You must specify a valid lifecycle phase or a goal in the format

<plugin-prefix>:<goal> or

<plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>.

Available lifecycle phases are:

...

...请参阅下面的参考中的实际输出或Maven,构建生命周期简介

参考

于 2015-06-20T12:17:01.417 回答
45

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

迟到只是为了澄清这个线程中缺少的另一个粒度级别:(目标的)执行,这是 Maven 构建的最小单元。

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

一张我准备恢复的图片 在此处输入图像描述

事实上,这就是 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阶段期间(不幸的是,仅mvn -X ...在调试时提及REACTOR BUILD PLAN – Tasks: [...])→</li>
  • 我正在调用 Maven 编译器插件(由artifactId和指定version),其compile目标是 →</li>
  • execution由与定义id default-compile

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

默认执行通过Maven 打包绑定提供开箱即用,也就是说,默认情况下(并且强制约定优于配置)Maven 已经在某些阶段调用了某些目标(标准插件的)。这些默认调用的执行 ID 是根据某些约定定义的。

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

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

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

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

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

(注意:您也可以仅在一次调用中调用 inline)

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

ps 请注意,当为同一个目标指定多个目标时execution,您仍然会在构建日志中清楚地看到两个不同目标的两个不同执行(具有相同的 id)(因此,仍然是唯一的元组)。

于 2016-03-12T23:09:14.880 回答
21

归功于 Sandeep Jindal 和 Premraj(从这里什么是 Maven 目标和阶段,它们有什么区别?)。他们的解释帮助我理解。

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

简而言之,从链接中,您不应该试图同时了解所有三个,首先您应该了解这些组中的关系:

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

1. 生命周期与阶段

生命周期是按顺序排列的阶段的集合,请参见此处生命周期参考。当你调用一个阶段时,它也会调用它之​​前的所有阶段

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

mvn clean

它将调用pre-cleanclean

2. 插件与目标

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

你可以这样称呼一个目标:

mvn clean:clean

这意味着“在 clean 插件中调用 clean 目标”(此处与 clean 阶段无关。不要让“clean”这个词让您感到困惑,它们是不一样的!请参阅我上面的链接中的完整解释)

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

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

mvn clean

它将调用 pre-clean 阶段和链接到 clean:clean 目标的 clean 阶段。

它几乎与以下内容相同:

mvn pre-clean clean:clean
于 2017-01-04T14:42:50.540 回答
20

迟来的另一张图

  • 生命周期为黄色矩形
  • 生命周期的阶段为蓝色矩形, “可调用”阶段为深蓝色(即带有连字符的阶段通常不会从命令行调用,因为它们可能不是为了让项目处于明确定义的状态而设计的)。
  • 作为蓝色菱形的目标。显示的关联/绑定“阶段->目标”是“jar”包装模式之一。每个阶段都可以有与之绑定的目标。这当然适用于每个生命周期,尽管绑定仅针对“默认”生命周期显示。
  • 插件为灰色裁剪矩形。插件提供可以绑定到阶段的目标。

Maven 生命周期、阶段、目标、插件

于 2017-09-03T22:51:04.530 回答
15

来自这个非常好的教程

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

  • Maven 命令mvn仅接受生命周期阶段或插件目标作为参数。
  • Maven 带有三个生命周期:默认、干净和站点。
  • 每个生命周期都由生命周期阶段组成,总共有 28 个阶段——默认 21 个验证、...、编译、...、包、...、安装、部署),3 个干净预clean, clean, post-clean ) 和4 in site ( pre-site, site, post-site, site-deploy )。
  • 当使用该mvn命令调用生命周期阶段时,前面的所有阶段都会依次执行。
  • 生命周期阶段本身没有能力完成任何任务,它们依赖插件来执行任务。
  • 根据项目和打包类型,Maven 将各种插件目标绑定到生命周期阶段,目标执行委托给它们的任务。

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

mvn 插件包目标

于 2017-03-14T20:24:26.890 回答
7

所以要进一步解释这里概述的

Maven 构建在生命周期中被拆分,它们是:

  • 干净的
  • 构建(默认)
  • 地点

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

  • 准备资源
  • 编译
  • 包裹
  • 安装

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

  • pre-clean - 将在 clean 阶段之前执行
  • post-clean - 将在 clean 阶段之后执行

如果您愿意,您可以将目标视为额外的“插入”阶段。在此处阅读或查看@Gerolds 答案以了解详细信息。

于 2014-10-28T18:27:15.280 回答
3

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

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

清洁生命周期有 3 个阶段:清洁前、清洁和清洁后。默认和站点生命周期的阶段如图所示。

于 2017-09-22T08:27:01.120 回答