分享

一张图带你看懂maven生命周期以及执行原理

本帖最后由 孤独的战神 于 2020-7-12 21:13 编辑

1、maven生命周期,就是去解释mvn各种命令背后的原理
清理、初始化、编译、测试、打包、集成测试、验证、部署、站点生成

用专业术语来说,maven的生命周期,就是对传统软件项目构建工作的抽象


maven有三套完全独立的生命周期,cleandefaultsite。每套生命周期都可以独立运行(三个生命周期也可以同时运行),每个生命周期的运行都会包含多个phase,每个phase又是由各种(一个或者多个)插件(plugin)的goal来完成的,一个插件的goal可以认为是一个功能(每一个功能就是一个具体的事情,比如:编译单元测试代码)。

这就是maven的生命周期 -> phase(可以理解为阶段) -> 插件的关系,也是maven构建执行的核心原理

你每次执行一个生命周期,都会依次执行这个生命周期内部的多个phase,每个phase执行时都会执行某个(一个或者多个plugin)插件的goal完成具体的功能

ZKZO7RAW]`31]G%MV~70`RI.png

2maven的生命周期以及phase

clean生命周期包含的phase如下:

pre-clean 清理之前工作
clean 清理target目录下的上一次构建的文件
post-clean 清理之后工作

default生命周期包含的phase如下:

validate:校验这个项目的一些配置信息是否正确
initialize:初始化构建状态,比如设置一些属性,或者创建一些目录
generate-sources:自动生成一些源代码,然后包含在项目代码中一起编译
process-sources:处理源代码,比如做一些占位符的替换
generate-resources:生成资源文件,才是干的时我说的那些事情,主要是去处理各种xmlproperties那种配置文件,去做一些配置文件里面占位符的替换
process-resources:将资源文件拷贝到目标目录中,方便后面打包
compile:编译项目的源代码
process-classes:处理编译后的代码文件,比如对java class进行字节码增强
generate-test-sources:自动化生成测试代码
process-test-sources:处理测试代码,比如过滤一些占位符
generate-test-resources:生成测试用的资源文件
process-test-resources:拷贝测试用的资源文件到目标目录中
test-compile:编译测试代码
process-test-classes:对编译后的测试代码进行处理,比如进行字节码增强
test:使用单元测试框架运行测试
prepare-package:在打包之前进行准备工作,比如处理package的版本号
package:将代码进行打包,比如jar
pre-integration-test:在集成测试之前进行准备工作,比如建立好需要的环境
integration-test:将package部署到一个环境中以运行集成测试
post-integration-test:在集成测试之后执行一些操作,比如清理测试环境
verify:对package进行一些检查来确保质量过关
install:将package安装到本地仓库中,这样开发人员自己在本地就可以使用了
deploy:将package上传到远程仓库中,这样公司内其他开发人员也可以使用了

site生命周期的phase

pre-site
site 生成工程的文档的站点
post-site
site-deploy 将生成的文档部署到远程的web容器中去

3、默认的phaseplugin绑定

但是问题来了,那么我们直接运行mvn clean package的时候,每个phase都是由插件的goal来完成的,phaseplugin绑定关系是?

实际上,默认maven就绑定了一些plugin goalphase上去,比如:

类似于resources:resources这种格式,说的就是resources这个pluginresources goalresources功能,负责处理资源文件)

default生命周期的默认绑定是:
process-resources                               resources:resources
compile                                                     compiler:compile
process-test-resources                     resources:testResources
test-compile                                           compiler:testCompile
test                                                              surefire:test
package                                                     jar:jar或者war:war
install                                                         install:install
deploy                                                        deploy:deploy

site生命周期的默认绑定是:

site                                                              site:site
site-deploy                                              site:deploy

clean生命周期的默认

clean                                                           clean:clean

到此为止,基本我们就很清楚maven的声明周期、phaseplugin的关系,同时也清楚我们运行类似mvn clean package之类的命令时,到底是在干啥了。。。。。。也知道为啥这个命令一执行,就可以实现清理、打包之类的功能更了。。。

4maven的命令行和生命周期

比如mvn clean package

clean是指的clean生命周期中的cleanphase
package是指的default生命周期中的packagephase

此时就会执行clean生命周期中,在clean phase之前的所有phaseclean phasepre cleanclean
同时会执行default生命周期中,在package phase之前的所有phasepackage phase

比如:mvn clean package

clean生命周期的pre cleanclean两个phase
但是,pre clean phase默认是没有绑定任何一个plugin goal的,所以默认什么也不会干;clean phase默认是绑定了clean:cleanclean pluginclean goal,所以就会去执行clean插件的clean goal,就会实现一个功能,就是清理target目录下的文件
执行顺序如下:
clean                                                           clean:clean
process-resources                               resources:resources
compile                                                     compiler:compile
process-test-resources                     resources:testResources
test-compile                                           compiler:testCompile
test                                                              surefire:test
package                                                     jar:jar或者war:war


mvn clean install
clean                                                           clean:clean
process-resources                               resources:resources
compile                                                     compiler:compile
process-test-resources                     resources:testResources
test-compile                                           compiler:testCompile
test                                                              surefire:test
package                                                     jar:jar或者war:war
install                                                         install:install

mvn clean deploy
clean                                                           clean:clean
process-resources                               resources:resources
compile                                                     compiler:compile
process-test-resources                     resources:testResources
test-compile                                           compiler:testCompile
test                                                              surefire:test
package                                                     jar:jar或者war:war
install                                                         install:install
deploy                                                        deploy:deploy

mvn dependency:tree
mvn deploy:deploy-file

就是不执行任何一个生命周期的任何一个phase

直接执行指定的插件的一个goal

比如mvn dependency:tree,就是直接执行dependency这个插件的tree这个goal,这个意思就是会自动分析pom.xml里面的依赖声明,递归解析所有的依赖,然后打印出一颗依赖树

mvn deploy:depoy-file,就是直接执行deploy这个插件的deploy-file这个goal,这个意思就是说将指定目录的jar包,以指定的坐标,部署到指标的maven私服仓库里去,同时使用指定仓库id对应的server的账号和密码。

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条