孤独的战神 发表于 2020-7-12 21:12:11

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

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

1、maven生命周期,就是去解释mvn各种命令背后的原理清理、初始化、编译、测试、打包、集成测试、验证、部署、站点生成
用专业术语来说,maven的生命周期,就是对传统软件项目构建工作的抽象

maven有三套完全独立的生命周期,clean,default和site。每套生命周期都可以独立运行(三个生命周期也可以同时运行),每个生命周期的运行都会包含多个phase,每个phase又是由各种(一个或者多个)插件(plugin)的goal来完成的,一个插件的goal可以认为是一个功能(每一个功能就是一个具体的事情,比如:编译单元测试代码)。
这就是maven的生命周期 -> phase(可以理解为阶段) -> 插件的关系,也是maven构建执行的核心原理
你每次执行一个生命周期,都会依次执行这个生命周期内部的多个phase,每个phase执行时都会执行某个(一个或者多个plugin)插件的goal完成具体的功能

2、maven的生命周期以及phase
clean生命周期包含的phase如下:
pre-clean 清理之前工作clean 清理target目录下的上一次构建的文件post-clean 清理之后工作
default生命周期包含的phase如下:
validate:校验这个项目的一些配置信息是否正确initialize:初始化构建状态,比如设置一些属性,或者创建一些目录generate-sources:自动生成一些源代码,然后包含在项目代码中一起编译process-sources:处理源代码,比如做一些占位符的替换generate-resources:生成资源文件,才是干的时我说的那些事情,主要是去处理各种xml、properties那种配置文件,去做一些配置文件里面占位符的替换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-sitesite 生成工程的文档的站点post-sitesite-deploy 将生成的文档部署到远程的web容器中去
3、默认的phase和plugin绑定
但是问题来了,那么我们直接运行mvn clean package的时候,每个phase都是由插件的goal来完成的,phase和plugin绑定关系是?
实际上,默认maven就绑定了一些plugin goal到phase上去,比如:
类似于resources:resources这种格式,说的就是resources这个plugin的resources goal(resources功能,负责处理资源文件)
default生命周期的默认绑定是:process-resources                               resources:resourcescompile                                                   compiler:compileprocess-test-resources                     resources:testResourcestest-compile                                           compiler:testCompiletest                                                            surefire:testpackage                                                   jar:jar或者war:warinstall                                                         install:installdeploy                                                      deploy:deploy
site生命周期的默认绑定是:
site                                                            site:sitesite-deploy                                              site:deploy
clean生命周期的默认
clean                                                         clean:clean
到此为止,基本我们就很清楚maven的声明周期、phase和plugin的关系,同时也清楚我们运行类似mvn clean package之类的命令时,到底是在干啥了。。。。。。也知道为啥这个命令一执行,就可以实现清理、打包之类的功能更了。。。
4、maven的命令行和生命周期
比如mvn clean package
clean是指的clean生命周期中的cleanphasepackage是指的default生命周期中的packagephase
此时就会执行clean生命周期中,在clean phase之前的所有phase和clean phase,pre clean,clean同时会执行default生命周期中,在package phase之前的所有phase和package phase
比如:mvn clean package
clean生命周期的pre clean,clean两个phase但是,pre clean phase默认是没有绑定任何一个plugin goal的,所以默认什么也不会干;clean phase默认是绑定了clean:clean,clean plugin的clean goal,所以就会去执行clean插件的clean goal,就会实现一个功能,就是清理target目录下的文件执行顺序如下:clean                                                         clean:cleanprocess-resources                               resources:resourcescompile                                                   compiler:compileprocess-test-resources                     resources:testResourcestest-compile                                           compiler:testCompiletest                                                            surefire:testpackage                                                   jar:jar或者war:war

mvn clean installclean                                                         clean:cleanprocess-resources                               resources:resourcescompile                                                   compiler:compileprocess-test-resources                     resources:testResourcestest-compile                                           compiler:testCompiletest                                                            surefire:testpackage                                                   jar:jar或者war:warinstall                                                         install:install
mvn clean deployclean                                                         clean:cleanprocess-resources                               resources:resourcescompile                                                   compiler:compileprocess-test-resources                     resources:testResourcestest-compile                                           compiler:testCompiletest                                                            surefire:testpackage                                                   jar:jar或者war:warinstall                                                         install:installdeploy                                                      deploy:deploy
mvn dependency:treemvn 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的账号和密码。
页: [1]
查看完整版本: 一张图带你看懂maven生命周期以及执行原理