对一个项目进行打包时,maven分别执行了 validate->compile->test->package,这个过程就是生命周期(lifecycle)。在生命周期的过程中会有很多的阶段(phase),这些阶段按照既定的顺序执行来完成一个项目的构建。
在生命周期中,各个阶段的工作由插件(plugin)来完成,一个插件通常可以完成一个或者多个阶段的工作。每个阶段的工作对应插件中的一个目标(goal)。不同的插件结合起来,就完成了整个项目的构建。
生命周期-lifecycle
maven的生命周期可以分为三大类:
- Clean Lifecycle:在进行真正的构建之前进行一些清理工作
- Default Lifecycle:构建的核心部分,编译,测试,打包,部署等等
- Site Lifecycle:生成项目报告,站点,发布站点
Clean Lifecycle
生命周期Clean Lifecycle包含的阶段(phase):
- pre-clean:执行一些需要在clean之前完成的工作
- clean:移除所有上一次构建生成的文件
- post-clean:执行一些需要在clean之后立刻完成的工作
Default Lifecycle
生命周期Default Lifecycle包含的阶段(phase):
- validate:验证工程是否正确,所需的信息是否完整
- initialize:初始化构建平台,例如:设置properties或创建目录
- generate-sources
- process-sources
- generate-resources
- process-resources:复制并处理资源文件,至目标目录,准备打包
- compile:编译源代码
- process-classes:源码编译后的后期处理,比如java字节码的增强(优化?)
- generate-test-sources
- process-test-sources
- generate-test-resources
- process-test-resources
- test-compile:编译测试源代码(默认是test目录下)
- process-test-class
- test:执行单元测试
- prepare-package
- package:将工程文件打包为指定的格式,例如JAR,WAR等
- pre-integration-test
- integration-test:集成测试
- post-integration-test
- verify:检查package是否有效、符合标准
- install:将包安装至本地仓库,以让其它项目依赖。
- deploy:将最终的包复制到远程的仓库,以让其它开发人员与项目共享。
Site Lifecycle
生命周期Site Lifecycle包含的阶段(phase):
- pre-site:执行一些需要在生成站点文档之前完成的工作
- site:生成项目的站点文档
- post-site:执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
- site-deploy:将生成的站点文档部署到特定的服务器上
注:执行一个phase将会执行这个lifecycle前面的所有phase。
goal
执行phase实际执行的是goal。如果一个phase没有绑定goal,那这个phase就不会被执行。一些phase默认已经绑定了一些goal。例如:阶段compile绑定的goal是compiler:compile、阶段package绑定的goal是jar:jar。
所以,phase其实就是goal的容器,实际被执行的都是goal。phase被执行时,实际执行的都是被绑定到该phase的goal。
例子:
mvn clean dependency:copy-dependencies package
- clean是phase。
- dependency:copy-dependencies是goal。maven-dependency-plugin插件的copy-dependencies(goal目标)。
- package也是一个phase。
maven会顺序执行这3个对象中包含的所有goal。clean阶段会首先执行(包括在它以前的阶段),然后是dependency:copy-dependencies插件目标,最后package阶段被执行(包括它之前的阶段)。
注:dependency:copy-dependencies是一种 “前缀:目标” 的简写方式。默认情况下,Maven通过去除artifactId的maven和plugin来确定插件前缀:
- maven-${prefix}-plugin:官方插件使用的artifactId
- ${prefix}-maven-plugin:其他来源的插件(如 tomcat 插件:tomcat7-maven-plugin)
所以,dependency:copy-dependencies表示使用maven-dependency-plugin插件的copy-dependencies目标。
自定义plugin
我们可以通过在project中使用plugin,将各种各样的goal加入到Maven的phase中,从而根据自己的实际需求,灵活实现各种定制功能。
如何将display-maven-plugin中的goal time绑定到process-test-resources这个phase中
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/maven-v4_0_0.xsd">
...
<plugin>
<groupId>com.mycompany.example</groupId>
<artifactId>display-maven-plugin</artifactId>
<version>1.0</version>
<executions>
<execution>
<phase>process-test-resources</phase>
<goals>
<goal>time</goal>
</goals>
</execution>
</executions>
</plugin>
</project>
在编译时执行HelloWord类的man方法
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/maven-v4_0_0.xsd">
...
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<executions>
<execution>
<!-- 绑定到编译的生命周期 -->
<phase>compile</phase>
<goals>
<!-- 执行目标java -->
<goal>java</goal>
</goals>
<configuration>
<mainClass>x.x.x.HelloWord</mainClass>
</configuration>
</execution>
</executions>
</plugin>
</project>
如果想知道插件中包含哪些goal:
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-eclipse-plugin:2.10
输出: