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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ mvn org.apache.maven.plugins:maven-dependency-plugin:2.8:tree   # 这儿可简写为 mvn dependency:tree
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Archetype - demo-mvn 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ demo-mvn ---
[INFO] net.codox.demo:demo-mvn:jar:1.0-SNAPSHOT
[INFO] \- org.springframework:spring-aop:jar:3.1.0.RELEASE:compile
[INFO] +- aopalliance:aopalliance:jar:1.0:compile
[INFO] +- org.springframework:spring-asm:jar:3.1.0.RELEASE:compile
[INFO] +- org.springframework:spring-beans:jar:3.1.0.RELEASE:compile
[INFO] \- org.springframework:spring-core:jar:3.1.0.RELEASE:compile
[INFO] \- commons-logging:commons-logging:jar:1.1.1:compile
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.198 s
[INFO] Finished at: 2017-10-07T22:17:11+08:00
[INFO] Final Memory: 7M/81M
[INFO] ------------------------------------------------------------------------

插件的解析

上节的命令 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<metadata>
<plugins>
<plugin>
<name>Apache Maven ACR Plugin</name>
<prefix>acr</prefix>
<artifactId>maven-acr-plugin</artifactId>
</plugin>
<!-- ***** -->
<plugin>
<name>Apache Maven Dependency Plugin</name>
<prefix>dependency</prefix>
<artifactId>maven-dependency-plugin</artifactId>
</plugin>
<!-- ***** -->
</plugins>
</metadata>

version的解析

当没写version时,maven会自动解析。分两种情况:

  • maven的内置超级pom文件,为核心插件设置了版本。如果使用的插件是这类,则已经内置了版本号。
  • 对非核心插件,会去检查仓库中的可用版本(获取插件的meta信息),并做出选择。meta信息中有latest版本、release版本的值。对于maven 2,则会使用latest版本(即最新版本,有可能是SNAPSHOT版,也即可能有风险),在maven 3中,使用relaese版本(即最近的发布版)

获取帮助

最方便的为使用maven-help-plugin来获取插件的信息,如:

1
2
3
4
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-compiler-plugin:2.1.4   # 完整写法
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-compiler-plugin # 简化版本,这样使用最新版来描述
mvn help:describe -Dplugin=compiler # 简化坐标为插件前缀
mvn help:describe -Dplugin=compiler -Ddetail # 更详细信息

对于maven的插件,可去官方网站寻找资料: maven插件官网

对于以前大师的codehaus的插件,好像这个站在2015年关了。新的替代者: MojoHaus