Maven的Build过程

1、Lifecycle的定义
Maven通过Lifecycle定义了编译和发布项目的过程
有3个内置的Lifecycle,分别是default,clean,site.


2、Lifecycle与Phase的关系
一个Lifecycle包含多个Phase,这个包含关系是不可修改的,同一个Lifecycle中的Phase之间是具有顺序的,执行某一个Lifecycle中的某个Phase,那么该Lifecycle中该Phase之前的Phase首先会被依序执行
比如
default这个Lifecycle包含的Phase如下所示


执行"mvn compile"命令

在后台会依次执行"validate,initialize,generate-sources,process-sources,generate-resources,process-resources,compile"这7个Phase


clean这个Lifecycle包含的Phase如下所示


执行"mvn clean"命令
在后台会依次执行"pre-clean,clean"这两个Phase


site这个Lifecycle包含的Phase如下所示


执行"mvn post-site"命令
在后台会依次执行"pre-site,site,post-site"这3个Phase


3、Phase与Plugin Goal的关系
Goal是plugin提供的完成具体功能的模块,最终完成任务通过Goal进行。
使用Goal的方式有两种:一种是通过命令行直接调用Goal的方式进行,比如
mvn dependency:copy-dependencies[表示执行"maven-dependency-plugin"这个Plugin中的"copy-dependencies"这个Goal];另外一种是通过Goal能够被绑定到"Lifecycle-Phase体系"中的Phase的途径,一个Phase上可以绑定0到多个Goal,Phase上绑定了0个Goal,那么执行该Phase不会有任何操作发生,Phase上绑定了1到多个Goal,那么执行该Phase会依次执行绑定在该Phase上的Goal,比如执行"site-deploy"这个Phase的时候,默认绑定在该Phase上的Goal是"maven-site-plugin"这个Plugin中的"deploy"这个Goal,该Goal会被执行


4、默认情况下,Phase与Goal的绑定关系

4.1、clean Lifecycle中Phase与Goal的绑定关系


4.2、site Lifecycle中Phase与Goal的绑定关系


4.3、default Lifecycle中Phase与Goal的绑定关系
default Lifecycle中Phase与Goal的绑定关系跟项目的<packaging>配置有关。

4.3.1、<packaging>为ejb/ejb3/jar/par/rar/war


4.3.2、<packaging>为ear


4.3.3、<packaging>为pom


5、Goal的执行顺序
5.1、绑定在同一个Phase上的Goal的执行顺序
一般情况下,先执行Phase上默认绑定的Goal,然后执行在pom.xml中定义的Phase上绑定的Goal。而其实我们可以通过<execution>标签改变一般情况下的执行顺序。
总的来说,Maven采用非常复杂的一个机制来确定绑定在同一个Phase上的Goal的执行顺序。

因而,我们最好还是规定在同一个Phase上至多绑定一个Goal。


5.2、通过"Lifecycle-Phase"绑定Goal机制和直接调用Goal两种形式执行Goal的执行顺序
最终Goal的执行顺序跟“解析Phase上绑定的Goal(如5.1所述,一个Phase上至多绑定一个Goal)之后,完整Goal序列的出现顺序”一致。
比如如下maven命令:
mvn clean compile assembly:single
"clean"这个Phase属于clean这个Lifecycle,"clean"这个Phase的前导Phase有"pre-clean"。
"pre-clean"这个Phase默认无绑定Goal

"clean"这个Phase默认绑定"clean:clean"这个Goal


"compile"这个Phase属于default这个Lifecycle,"compile"这个Phase的前导Phase有"validate,initialize,generate-sources,process-sources,generate-resources,process-resources"
default Lifecycle中Phase与Goal的绑定关系跟项目的<packaging>配置有关,假如现在的<packaging>配置值为jar。
"validate,initialize,generate-sources,process-sources,generate-resources"这些Phase默认无绑定Goal
"process-resources"这个Phase默认绑定"resources:resources"这个Goal

"compile"这个Phase默认绑定"compiler:compile"这个Goal


因此,最终完整的Goal序列为:

clean:clean,resources:resources,compiler:compile,assembly:single


备注:
指代Goal名称的"xxx:goalName"表示法的含义是:"maven-xxx-plugin"这个Plugin中的"goalName"这个Goal。比如"compiler:compile"的含义就是"maven-compiler-plugin"这个Plugin中的"compile"这个Goal。


参考文献:
[1]https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
[2]https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Lifecycle_Reference
[3]https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Built-in_Lifecycle_Bindings
[4]http://maven.apache.org/ref/3.3.3//maven-core/lifecycles.html
[5]http://maven.apache.org/ref/3.3.3//maven-core/default-bindings.html
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/DSLZTX/article/details/47038651
个人分类: 项目管理
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭