Maven的生命周期就是为了对项目的所有构建过程进行抽象和统一,包含了项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等步骤。也就是说所有项目的构建步骤,都能映射到一个生命周期上。
Maven的生命周期是抽象的,意味着生命周期不做任何实际的工作,在maven的设计中,实际的任务都交由插件完成。Maven为大多数构建步骤编写并绑定了默认插件。如,针对编译的有maven-compiler-plugin,针对测试的maven-surefire-plugin等。有特殊需要时,用户可以配置插件定制构建行为,甚至自己编写插件。
Maven定义的生命周期和插件机制一方面保证了所有Maven项目有一至的构建标准,另外又通过默认插件简化和稳定了实际项目的构建。此外,该机制还提供了足够的扩展空间,用户可以通过配置现有插件或者自行编写插件来自定义构建行为。
三套生命周期
Maven有三套相互独立的生命周期,分别是clean、default、site,其作用如下:
- clean:清理项目
- default:构建项目
- site:建立项目站点
每个生命周期包含一些阶段(phase),这些阶段是有顺序的,并且后面的阶段依赖于前面的阶段,用户和Maven最直接的交互方式就是调用这些生命周期阶段。
clean生命周期
它包含三个阶段:
- pre-clean: 执行一些清理前需要完成的工作
- clean:清理上一次构建生成的文件
- post-clean: 执行一些清理后需要完成的工作
default生命周期
default生命周期定义了真正构建时所需要执行的所有步骤,它是所有生命周期是最核心的部分,其包含的阶段如下,只对重要阶段进行解释:
- validate
- initialize
- generate-sources
- process-sources: 处理项目主资源文件。一般来说,是对src/main/resources目录的内容进行变量替换等工作后,复制到项目输出的主classpath目录中。
- generate-resources
- process-resources
- compile: 编译项目的主源码。一般来说,是编译src/main/java目录下的Java文件至项目输出的主classpath目录中。
- process-classes
- generate-test-souces
- process-test-source: 处理项目测试资源文件。一般来说,是对src/test/resource目录的内容进行变量替换工作后,复制到项目输出的测试classpath目录中。
- generate-test-resources
- process-test-resources
- test-compile: 编译项目的测试代码。一般来说,是编译src/test/java目录下的Java文件至项目输出的测试classpath目录中。
- process-test-classes
- test: 使用单元测试框架运行测试,测试代码不会被打包或部署
- prepare-package
- package: 接受编译好的代码,打包成可发布的格式,如jar
- pre-integration-test
- integration-test
- post-integration-test
- verify
- instll: 将包安装到Maven本地仓库,供本地其他Maven项目使用
- deploy: 将最终的包复制到远程仓库,供其他开发人员和Maven项目使用。
site生命周期
Maven能够基于Pom所包含信息,自动的生成一个友好的站点,方便团队交流和发布项目信息。包含如下阶段:
- pre-site: 执行一些在生成项目站点之前需要完成的工作。
- site: 生成项目站点文档
- post-site: 执行一些在生成项目站点之后需要完成的工作。
- site-deploy: 将生成的项目站点发布到服务器上。
命令行与生命周期
从命令行执行Maven任务的最主要方式就是调用Maven的生命周期阶段。在每个生命周期中,调用其某个阶段时,会顺序执行该生命周期中起始阶段到该阶段的所有阶段,不会影响其他生命周期的阶段执行。如下举例说明:
- mvn clean: 实际会执行clean生命周期的pre-clean和clean阶段。
- mvn test: 实际执行default生命周期中从validate直到test的所有阶段。
- mvn clean install: 实际调用clean生命周期的pre-clean和clean阶段,以及default生命周期的从validate到install的所有阶段。