尽管我已经使用了一段时间,但还是相对较新的开发人员,我希望巩固我的Maven基础。我的部分问题是我没有使用Ant的经验,这似乎源于许多解释。我一直在阅读和观看教程,并且不断听到相同的用语:
- 生命周期
- 相
- 插入
- 目标
据我了解,生命周期似乎是最广泛的,并且由阶段,插件和/或目标组成(或由其完成)。
问题:您能否提供有关这些术语如何关联以及最常见示例的信息?
越明确越基本,越好!
尽管我已经使用了一段时间,但还是相对较新的开发人员,我希望巩固我的Maven基础。我的部分问题是我没有使用Ant的经验,这似乎源于许多解释。我一直在阅读和观看教程,并且不断听到相同的用语:
据我了解,生命周期似乎是最广泛的,并且由阶段,插件和/或目标组成(或由其完成)。
问题:您能否提供有关这些术语如何关联以及最常见示例的信息?
越明确越基本,越好!
Answers:
一个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:
... see actual output or 'Maven, Introduction to the Build Lifecycle' at 'References' below ...
参考文献:
如果您想知道Maven如何知道如何在POM中没有任何目标约束的情况下进行操作default-bindings.xml
,则位于的末尾有一个链接<Your Maven installation>/lib/maven-core-x.y.z.jar/META-INF/plexus/default-bindings.xml
。
内置生命周期的阶段(clean,default,site)<Your Maven installation>/lib/maven-core-x.y.z.jar/META-INF/plexus/components.xml
在下声明.../<component>/<role>org.apache.maven.lifecycle.Lifecycle
。
Maven:生命周期,阶段,插件,目标
稍后回答只是为了弄清楚此线程中缺少的另一个粒度级别:(目标)执行,这是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 ---
这确实意味着(通过不同级别的粒度):
它的独特之处在于,您确实可以将相同的目标(相同的插件)绑定到不同的阶段或相同的阶段,但是执行方式不同(即使用不同的配置)。的maven-compiler-plugin
,例如,也被在使用test-compile
相位(不同的相位)来编译测试代码(通过其testCompile
在不同的执行目标)( default-testCompile
)。您还可以在不同阶段编译(使用相同的插件和目标)一些自动生成的代码,该阶段由您在POM中指定的执行定义(可能还有不同的配置)。
默认执行是通过Maven打包绑定提供的,即开即用,即默认情况下(并强制执行配置约定),Maven在某些阶段已经调用了(标准插件的)某些目标。这些默认调用的执行ID是根据某些约定定义的。
这也解释了为什么如果您真的要覆盖Maven构建的默认行为(绑定),则需要在POM中为同一插件指定(覆盖)完全相同的执行ID。例如,您可以跳过编译,而只需定义执行maven-compiler-plugin
具有相同default-compile
ID但绑定到不存在的阶段(或空阶段)的的执行即可。
简而言之:执行告诉Maven在哪个阶段以哪个配置执行哪个目标。
默认情况下会提供一些执行(默认绑定),这说明了为什么只有6行的maven最小pom可以做很多事情(编译,测试,打包等):在某些阶段执行标准插件的目标:组态。然后,通过配置,您可以向构建中添加内容(执行)或影响已经配置的插件的行为(在这种情况下,没有节,而仅仅是pom.xml
executions
configuration
足够了)。
是的,您可以跳过构建周期(及其阶段),并直接调用(插件的)目标。想象以下情况:
mvn compiler:compile
mvn compiler:testCompile
mvn surefire:test
mvn jar:jar
(注意:您也只能在一个调用中调用内联)
在这里,我们正在编译应用程序代码,测试代码,执行测试和打包:想象一下这将是多么手动,容易出错,重复和耗时。约定优于配置有助于我们:Maven引入了构建生命周期和阶段。默认生命周期(没有名称,即默认名称)根据最佳实践和约定(Maven的口头禅)提供了一系列阶段。
如果要实现与上述相同的功能,只需运行:mvn package
,它将自动编译,测试和打包您的项目。怎么样?调用插件。也就是说,阶段是有意义的且可配置的一组插件(目标)执行。为了使其更加标准化,对于每个阶段,Maven都会首先调用任何先前的阶段,因此,例如,如果您要进行测试,则可以确保首先进行编译。
ps注意,当为同一目标指定多个目标时execution
,您仍将在构建日志中清楚地看到两个不同目标(因此仍然是唯一的元组)的两个不同执行(具有相同的id)。
感谢Sandeep Jindal和Premraj(从这里开始,Maven的目标和阶段是什么,它们之间有什么区别?)。他们的解释帮助我理解。
我在这里https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/创建了一些完整的代码示例和一些简单的说明。我认为这可以帮助其他人理解并可以直接尝试一些东西。
简而言之,您不应尝试一次理解所有这三个部分,首先应该了解这些组中的关系:
1.生命周期与阶段
生命周期是按顺序收集的阶段,请参阅此处的生命周期参考。当您调用一个阶段时,它还将调用之前的所有阶段。
例如,清洁生命周期分为三个阶段(预清洁,清洁,后清洁)。
mvn clean
它将称为pre-clean和clean。
2.插件与目标
目标就像是Plugin中的一个动作。因此,如果plugin是一个类,目标是一种方法。
您可以这样设定目标:
mvn clean:clean
这意味着“在清理插件中调用清理目标”(这里与清理阶段无关。不要让“清理”一词使您感到困惑,它们是不一样的!请参见上面我的链接中的完整说明)
3.现在,阶段与目标之间的关系:
阶段可以(预先)链接到目标。例如,通常,清洁阶段链接到清洁目标。因此,当您调用此命令时:
mvn clean
它将调用预清洁阶段和链接到clean:clean目标的clean阶段。
它几乎与以下内容相同:
mvn pre-clean clean:clean
clean:clean
不是示例的最佳选择。有4个名为clean
(生命周期,阶段,插件,目标)的项目可能会引起混淆,尤其是对于初学者(我记得它一开始是对我来说)。@ 3.恕我直言,动词“链接”也不是一个好选择。Maven的正式术语是“ bind ”。
迟来的是另一个图
validate
,initialize
和verify
。
modello:java
所述的MODELLO插件显然是域特定的。将插件的目标绑定到阶段适用于任何阶段。
来源,这真的是很好的教程
生命周期,生命周期阶段,插件和插件目标是Maven的核心。
当我们运行“在Java Project中 mvn package ”时,Maven将插件目标绑定到生命周期阶段,如下图所示。
mvn ...
:在default-bindings.xml或POM中,它不是由Maven而是由人类完成的。
因此,如此处概述,进一步解释一下
Maven构建按生命周期划分为:
每个周期都分为几个阶段。例如,构建分为以下几个阶段:
阶段有目标运行之前预先或之后后,例如一个阶段,:
如果愿意,您可以将目标视为其他“插入”阶段。在此处阅读或查看@Gerolds答案以获取详细信息。
LifeCycle vs Phases:
Life Cycle
是的集合phases
。当您调用一个阶段时,它还将调用之前的所有阶段。Maven带有3个内置的构建生命周期,分别是:
清洁生命周期分为三个阶段:预清洁,清洁和后清洁。默认生命周期和站点生命周期的阶段与图中所示相同。
mvn <phase>
。在这里看到我的答案。