Maven生命周期详解

Maven 的生命周期并非只有一套,而是有三套,并且这三套生命周期之间是没有关系的。一套生命周期包含很多个不同的阶段,这些不同的阶段是有顺序的,有些阶段必须要在某个阶段完成之后,才能进行。Maven 的三套生命周期分别为:clean(清理)default(默认)site(站点)


一、clean 生命周期包括:

  1. pre-clean: 清理前的准备工作;
  2. clean:清理上一次构建的结果;
  3. post-clean: 清理结束后需要完成的工作。

当执行mvn clean命令后,target目录中Maven的构建结构将被清空。

二、default生命周期

  1. validate:验证阶段。验证项目构建过程中需要的信息的正确性;
  2. compile:编译阶段;
  3. test:测试阶段。使用测试框架对项目进行测试,打包过程中,非必要阶段,可以跳过执行。
  4. package:打包阶段。将编译好的文件打包成 jar 包,war 包或者 ear 包;
  5. verify:检查阶段。检查打包结果的有效性;
  6. install:本地部署阶段。将包部署到本地仓库,可以提供给本地开发过程中其他项目使用;
  7. deploy:远程仓库部署阶段。将最终的包复制到远程仓库,提供给使用该仓库的其他开发者使用。

三、site生命周期

  1. pre-site:准备阶段。在生成站点前所需要做的工作;
  2. site:生成站点阶段;
  3. post-site:结束阶段。生成站点结束后所需要做的工作;
  4. site-deploy:发布阶段。我们可以将上面生成的站点发布到对应服务器中。

Maven插件

在 Maven 的世界中,生命周期只是一个抽象的模型,其本身并不会直接去做事情,真正帮我们完成事情的是 Maven 的插件。Maven 的插件也属于构件的一种,也是可以放到 Maven 仓库当中的。

Maven生命周期 - 图1

通常情况下,一个插件可以做 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>,因为数据库的连接只在运行时期才会起作用。