maven-life-cycle
maven 的生命周期
Maven 的生命周期就是为了对所有的构建过程进行抽象和统一。用maven在构建时,有三套生命周期:
- clean
- default
- site
这三套生命周期,涵盖了项目的清理、编译、测试、打包、部署等。
各周期的阶段
clean周期
在clean周期内,有以下三个阶段(phase),意义如其phase的名字:
- pre-clean
- clean
- post-clean
default周期
default周期是最重要的周期,主要有几下几个阶段:
- validate
- initialize
- generate-sources
- process-sources
- generate-resources
- process-resources
- compile
- process-classes
- generate-test-sources
- process-test-sources
- generate-test-resources
- process-test-resources
- test-compile
- process-test-classes
- test
- prepare-package
- package
- pre-integration-test
- integration-test
- post-integration-test
- verify
- install
- deploy
site
site主要是用来发布站点,有以下3个phase:
- pre-site
- site
- post-site
- site-deploy,将生成的项目站点发布到远程服务器上
命令行和生命周期
默认的mvn clean,执行的是test周期的pre-clean、clean阶段。
mvn test,是执行的默认周期的validate直到test阶段。
mvn clean install,是执行的test周期的pre-clean、clean,以及default周期的validate直到install阶段。
插件的目标和绑定
maven定义了项目的周期,但具体的周期的执行并不是maven自己来做,而是交给了众多的插件来完成的。比如maven-depedency-plugin就能分期项目的依赖关系。
maven的生命周期,和插件的目标相互绑定,才能完全相关的任务。如maven-compiler-plugin的compile目标,绑定(也在默认情况下绑定了)default周期的compile周期,就能完成项目的编译任务。maven内置了这么多插件的绑定。
test周期内的默认绑定
在test周期内,有maven-test-plugin绑定了部分test周期的阶段,如下:
| 阶段 | 目标 |
|---|---|
| pre-test | 无 |
| test | maven-test-plugin:test |
| post-test | 无 |
default周期的默认绑定
default周期,因使用的打包类型不同,默认绑定的插件周和周期也不同(如jar、war、pom、maven-plugin、ear等)。如jar/war包的默认绑定如下:
| 周期 | 目标 | 说明 |
|---|---|---|
| process-resources | maven-resources-plugin:resources | 复制主资源到主输出目录 |
| compile | maven-compiler-plugin:compile | 编译代码到主输出目录 |
| process-test-resources | maven-resources-plugin:testResources | 复制测试资源到测试输出目录 |
| test-compile | maven-compiler-plugin:testCompile | 编译测试代码到测试输出目录 |
| test | maven-surefire-plugin:test | 测试 |
| package | maven-jar-plugin:jar | 创建项目的jar包 |
| install | maven-install-plugin:install | 将输出的项目构件到本地仓库 |
| deploy | maven-deploy-plugin:deploy | 将位置子网的构件发布到远程仓库 |
site周期的绑定
| 阶段 | 目标 |
|---|---|
| pre-site | 无 |
| site | maven-site-plugin:site |
| post-site | 无 |
| deploy | maven-site-plugin:deploy |
其它和插件及周期相关的
从命令行直接运行插件目标
一般是通过mvn运行maven生命周期中的阶段(phase),间接运行phase绑定了插件对应的目标(goal)。我们也可以直接运行插件的目标,如下就是运行maven-dependency-plugin插件的tree目标:
1 | $ mvn org.apache.maven.plugins:maven-dependency-plugin:2.8:tree # 这儿可简写为 mvn dependency:tree |
插件的解析
上节的命令 mvn org.apache.maven.plugins:maven-dependency-plugin:2.8:tree 可简写为 mvn dependency:tree,即插件的groupId:artifactId:version,直接简写成了dependency,这个是使用了插件前缀来简写的。
- 插件也有仓库,和配置maven仓库的repositories一样,只是插件仓库的配置项为pluginRepositories。一般不需要配置自己的插件仓库。
- 如果在pom文件中配置插件时(build标签内),如果是官方插件(即groupId为org.apache.maven.plugins),则可省略groupId。
根据坐标定位插件,需要其groupId:artifactId:version三项,具体的解析如下:
插件前缀
插件前缀和groupId:artifactId是一一对应的,这个写在仓库的无数据中的groupId/maven-metadata.xml中。如maven的官方插件的maven-metadata.xml中列举了其对应的插件前缀:http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-metadata.xml
1 | <metadata> |
version的解析
当没写version时,maven会自动解析。分两种情况:
- maven的内置超级pom文件,为核心插件设置了版本。如果使用的插件是这类,则已经内置了版本号。
- 对非核心插件,会去检查仓库中的可用版本(获取插件的meta信息),并做出选择。meta信息中有latest版本、release版本的值。对于maven 2,则会使用latest版本(即最新版本,有可能是SNAPSHOT版,也即可能有风险),在maven 3中,使用relaese版本(即最近的发布版)
获取帮助
最方便的为使用maven-help-plugin来获取插件的信息,如:
1 | mvn help:describe -Dplugin=org.apache.maven.plugins:maven-compiler-plugin:2.1.4 # 完整写法 |
对于maven的插件,可去官方网站寻找资料: maven插件官网
对于以前大师的codehaus的插件,好像这个站在2015年关了。新的替代者: MojoHaus