maven 生命周期 --多模块组装下的生命周期
18.11.11 松江图书馆
maven的生命周期主要有三块
① clean lifecycle
② default (bluid) lifecycle
③ sit lifecycle
关于生命周期,我在学习servlet,session,cookies,request对象 等等… 都涉及到过。
但它们的生命周期一般都是一个线性的过程,比如“初始化-init配置-使用-destory等”; 再简单点,它们其实都是bean对象,对应着不同监听事件或者状态而创建对象,然后使用对象的方法,然后再到销毁对象。
但maven的生命周期由3个部分,也就是3个模块组成,咋一听,让我有些懵,生命周期不是线性的,而是由3个模块组成???~~~
我花了较长时间的消化,才在自己的认知障碍中得到救赎~~~。
3个模块,对应着3个功能和职责,每个模块中都有其执行对应功能的”线性“生命周期,而maven的生命周期,并不是由一个模块所组的,而是由3个功能模块共同协调组装来完成的。
因为是3个模块共同构成,maven的生命周期不像是完全线性的生命周期一样,是固定的一条线性关系,maven的生命周期是根据条件,由不同的模块组成的一个”不固定“的线性关系,但这里的”不固定“并不指每个模块中本来的生命周期顺序不固定,而是多模块构建时,调用模块功能前后顺序的不固定 (可能看博的人暂时也不能理解,这样的好处可能你需要在了解maven的一些指令后才能体会,可以查看 博文最后案例分析)
有了这样的认识后,我才算是在坑里爬了出来,才能让我理解maven的一些指令操作和执行流程方面的知识。~~
关于这3个功能模块,每个模块的功能,我自己简单的概括一下,具体每个模块的功能,可以参照每个模块对应的生命周期的功能描述
模块 | 模块功能描述 |
---|---|
clean | 清除target目录下的编译信息,每次调用build模块是,一般也会调用clean模块 |
default(build) | 通俗理解,就是编译文件,然后打包 |
site | 有关文档相关 |
clean 模块 对应的生命周期
执行阶段 | 描述说明 |
---|---|
pre-clean | 在实际的项目清理之前执行所需的过程 |
clean | 删除前一个构建生成的所有文件 |
post-clean | 执行完成项目清理所需的过程 |
Default(build)模块 对应的生命周期
执行阶段 | 描述说明 |
---|---|
validate | 验证项目是正确的,所有必要的信息都是可用的。 |
initialize | 初始化构建状态,例如设置属性或创建目录。 |
generate-sources | 生成包含在编译中的任何源代码。 |
process-sources | 处理源代码,例如过滤任何值。 |
generate-resources | 生成包含在包中的资源。 |
process-resources | 将资源复制并处理到目标目录中,准备打包。 |
compile | 编译项目的源代码。 |
process-classes | 从编译后生成生成的文件,例如在Java类上执行字节码增强。 |
generate-test-sources | 生成包含在编译中的任何测试源代码。 |
process-test-sources | 处理测试源代码,例如过滤任何值。 |
generate-test-resources | 为测试创建资源。 |
process-test-resources | 将资源复制并处理到测试目标目录中。 |
test-compile | 将测试源代码编译到测试目标目录 |
process-test-classes | 从测试编译后post-process生成文件,例如在Java类上执行字节码增强。对于Maven 2.0.5和以上。 |
test | 使用合适的单元测试框架运行测试。这些测试不应该要求打包或部署代码。 |
prepare-package | 在实际包装前执行必要的准备工作。这通常会导致包的一个未打包的、经过处理的版本。(Maven 2.1及以上) |
package | 使用已编译的代码,并将其打包成可部署格式,例如JAR。 |
pre-integration-test | 执行集成测试之前需要执行的操作。这可能涉及到设置所需的环境等问题。 |
integration-test | 在需要集成测试的环境中,处理并部署包。 |
post-integration-test | 执行集成测试后所需要的操作。这可能包括清理环境。 |
verify | 运行任何检查以验证包是否有效,并满足质量标准。 |
install | 将该包安装到本地存储库中,作为本地其他项目的依赖项。 |
deploy | 在集成或发布环境中完成,将最终包复制到远程存储库中,以便与其他开发人员和项目共享。 |
Site模块 对应的生命周期
执行阶段 | 描述说明 |
---|---|
pre-site | 在实际的项目站点生成之前执行过程 |
site | 生成项目的站点文档 |
post-site | 执行确定站点生成的过程,并为站点部署做好准备 |
site-deploy | 将生成的站点文档部署到指定的web服务器 |
对于maven构建的项目,想要实现compolie (编译) package(打包) clean 等功能,是需要借助这3块功能块里面的具体指令来实现的。而不同的指令表示操作着该模块下的对应的生命周期 (可能有点难理解,我们来看下面例子来体会)
maven 很多情况我们是借助IDE中的插件来执行,但其实maven也可以通过命令窗口来执行,下面的所以例子,都是在项目的目录下,打开dos窗口进行的命令操作:
mvn clean
既然是dos命令来操作,clean 它在这里表示的是一个指令, 但看这个名称我会猜到应该是操作 clean模块的,而clean指令操作的正clean功能中的clean生命阶段。
有没有感觉恍然大雾~
但此时我要引出一个想法,我们知道, 就具体的生命周期来说,它肯定是一个“线性的过程”,比如,如果session对象,session对象的生命周期,大概是“创建-使用-销毁”,如果没有创建,应该是不能使用的。
对应的我们上面的这个指令操作,我们知道Clean模块的生命周期是“pre-clean--->clean---> post-clean”
我们如果直接调用clean阶段,其实也应该是不行的,没错,但当你直接调用clean时,系统其实是执行了 pre-clean 和 clean 俩个阶段
mvn package
package 指令, 对应操作的是default模块中的 package阶段,同样,在执行package阶段时,此阶段前的所以动作也都会执行。
但因为每次打包,会涉及到对target目录下的文件编译等操作,而clean 模块的功能可以把target目录清空,所以,一般都会先执行 clean指令,然后再重新编译,打包
即
mvn clean package
案例分析
你需要深刻理解上面的 example 1: example 2: ,然后你就会发现:
当你执行 mvn package
,但系统会默认执行bulid模块中package阶段前的所以阶段;
这时,maven的生命周期为:(bukid模块中) validate阶段 …此处省略多个阶段…package阶段
但当你执行 mvn clean package
时, 会涉及到多模块组装生命周期,生命周期为 (clean模块)pre-(clean模块)clean…(bukid模块中) validate阶段 …此处省略多个阶段…(bukid模块中)package阶段
所以,多模块组装生命周期,并不会改变每个模块原本的生命周期顺序,但根据多模块组装条件,会产生不同的组装后的生命周期