Maven生命周期详解
Maven 的生命周期并非只有一套,而是有三套,并且这三套生命周期之间是没有关系的。一套生命周期包含很多个不同的阶段,这些不同的阶段是有顺序的,有些阶段必须要在某个阶段完成之后,才能进行。Maven 的三套生命周期分别为:clean(清理),default(默认),site(站点)。
一、clean 生命周期包括:
- pre-clean: 清理前的准备工作;
- clean:清理上一次构建的结果;
- post-clean: 清理结束后需要完成的工作。
当执行mvn clean
命令后,target目录中Maven的构建结构将被清空。
二、default生命周期
- validate:验证阶段。验证项目构建过程中需要的信息的正确性;
- compile:编译阶段;
- test:测试阶段。使用测试框架对项目进行测试,打包过程中,非必要阶段,可以跳过执行。
- package:打包阶段。将编译好的文件打包成 jar 包,war 包或者 ear 包;
- verify:检查阶段。检查打包结果的有效性;
- install:本地部署阶段。将包部署到本地仓库,可以提供给本地开发过程中其他项目使用;
- deploy:远程仓库部署阶段。将最终的包复制到远程仓库,提供给使用该仓库的其他开发者使用。
三、site生命周期
- pre-site:准备阶段。在生成站点前所需要做的工作;
- site:生成站点阶段;
- post-site:结束阶段。生成站点结束后所需要做的工作;
- site-deploy:发布阶段。我们可以将上面生成的站点发布到对应服务器中。
Maven插件
在 Maven 的世界中,生命周期只是一个抽象的模型,其本身并不会直接去做事情,真正帮我们完成事情的是 Maven 的插件。Maven 的插件也属于构件的一种,也是可以放到 Maven 仓库当中的。
通常情况下,一个插件可以做 A、B、C 等等不止一件事情,但是我们又没有必要为每一个功能都做一个单独的插件。这种时候,我们一般会给这个插件绑定不同的目标,而这些目标则是对应其不同的功能。
Maven依赖的范围
Maven 在编译和运行以及执行测试用例的时候,分别会使用不同的 classpath。而 Maven 的依赖范围则是用来控制依赖与不同 classpath 关系的。
Maven 的依赖范围分为以下几种:
- compile: 编译依赖范围。Maven 默认的依赖范围,该范围的依赖对
编译
,运行
,测试
不同的classpath 都有效。例如我们项目中的 spring-boot-starter; - test: 测试依赖范围。该依赖范围只对
测试
classpath 有效,在编译项目或者运行项目的时候,是无法使用此类依赖的。例如我们项目中的 spring-boot-starter-test; - provided: 已提供依赖范围。该 Maven 依赖对于
编译
和测试
的 classpath 有效,但是在运行时无效
; - runtime: 运行时依赖范围。顾名思义,该依赖范围对
测试
和运行
的 classpath 有效,但是在编译时无效
; - system: 系统依赖范围。直接引用本机磁盘上的jar使用,该依赖范围与 classpath 的关系与 provided 依赖范围是相同的。但是,在使用时需要谨慎注意,因为此类依赖大多数是与本机绑定的,而不是通过Maven仓库解析出来的,切换环境后,可能会导致依赖失效或者依赖错误。
比如在使用Junit的依赖时,就可以将依赖范围设置为<scope>test<scope>
,这样,Junit将只对测试的classpath路径起作用。而在使用JDBC驱动依赖时,依赖范围可以设置为<scope>runtime<scope>
,因为数据库的连接只在运行时期才会起作用。