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

Maven:生命周期vs.阶段vs.插件vs.目标,maven,maven-3,pom.xml,maven-lifecycle,Maven,Maven 3,Pom.xml,Maven Lifecycle,这里的开发人员相对较新,尽管我已经使用了一段时间,但我希望巩固我的Maven基础。我的部分问题是我对Ant没有经验,这似乎是许多解释的根源。我一直在阅读和观看教程,我不断听到相同的术语: 生命周期 阶段 插件 目标 据我所知,生命周期似乎是最广泛的,由(或由)阶段、插件和/或目标组成 问题:您能否提供这些术语的相关信息以及最常见的示例 越明确、越基本越好 因此,请进一步解释概述 Maven构建在生命周期中进行划分,这些生命周期包括: 干净的 生成(默认) 场地 每个周期分为几个阶段。 例

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

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

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


越明确、越基本越好

因此,请进一步解释概述

Maven构建在生命周期中进行划分,这些生命周期包括:

  • 干净的
  • 生成(默认)
  • 场地
每个周期分为几个阶段。 例如,构建分为以下几个阶段:

  • 准备资源
  • 编撰
  • 包装
  • 安装
阶段具有在阶段前或阶段后运行的目标,例如:

  • 预清洁-将在清洁阶段之前执行
  • 后清洁-将在清洁阶段后执行
如果愿意,您可以将目标视为附加的“插入”阶段。 阅读或查看详细信息。

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

Maven插件是目标/供应商的容器。在目标中实现的代码才是真正的主力。(). 每个插件的目标都可以分配/绑定到任何插件。

调用
mvn
时,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,构建生命周期简介

参考资料


如果您想知道Maven如何知道在POM中没有任何目标绑定的情况下该做什么,那么在该页面的底部有一个链接,该链接位于
/lib/Maven-core-x.y.z.jar/META-INF/plexus/default bindings.xml

内置生命周期(干净、默认、站点)的阶段在
../org.apache.maven.lifecycle.lifecycle
下声明

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 ---
这确实意味着(通过不同的粒度级别):

  • 在该阶段(不幸的是,仅在
    反应堆建造计划-任务:[……]
    下提到调试的
    mvn-X…
    )→
  • 我正在调用Maven编译器插件(由
    artifactId
    version
    指定)及其目标→
  • 执行
    id
    默认编译定义
它的独特之处在于,您可以将相同的目标(同一个插件)绑定到不同的阶段,或者绑定到相同的阶段,但执行方式不同(即使用不同的配置)。例如,
maven编译器插件
,也在(不同阶段)中使用,以在不同的执行(
defaulttestcompile
)中编译测试代码(通过其目标)。您还可以(使用相同的插件和目标)在不同的阶段编译一些自动生成的代码,这些阶段由您在POM中指定的执行(以及可能的不同配置)定义

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

这也解释了为什么如果你
mvn compiler:compile
mvn compiler:testCompile
mvn surefire:test
mvn jar:jar
mvn clean
mvn clean:clean
mvn clean
mvn pre-clean clean:clean