maven的生命周期是抽象的,这意味着生命周期本身不做任何实际的工作,在maven的设计中,实际的任务(比如编译源代码)都交由插件去完成。这种设计思想与设计模式中的模板方法非常类似。
public abstract class AbstractBuild { public void build() { initialize(); compile(); test(); packagee(); integrationTest(); deploy(); } protected abstract void initialize(); protected abstract void compile(); protected abstract void test(); protected abstract void packagee(); protected abstract void integrationTest(); protected abstract void deploy(); }
在maven的生命周期中,每个步骤可以绑定一个或多个插件行为,而且maven为大多数构建步骤编写并绑定了默认插件。例如针对编译的插件有maven-compiler-plugin,针对测试有maven-surefire-plugin等。
>> 三套生命周期详解
初学者往往以为maven生命周期是一个整体,其实不然,maven拥有三套相互独立的生命周期,它们分别是clean、default和site。clean升级周期目的是清理项目,default生命周期的目的是构件项目,而site生命周期目的是建立项目站点。
每个生命周期包含一些阶段phase,这些阶段是有顺序的,并且后面的阶段依赖于前面的阶段。
三套生命周期是相互独立的,比如当用户调用default生命周期的compile阶段的时候,是不会执行clean的,知道我要说啥了吧。
>> clean生命周期:
* pre-clean:执行清理前需要完成的工作
* clean清理上一次构建生成的文件
* post-clean:执行一些清理后需要完成的工作
>> default生命周期:
* validate
* initialize
* generate-sources
* process-sources:处理项目主资源文件。一般来说是对/src/main/resources/目录的内容进行变量替换等工作后,复制到输出目录的主classpath中去
* generate-resources
* process-resources
* compile:编译项目主源码到输出目录中去
* process-classes
* generate-test-sources
* process-test-sources:处理项目测试资源文件。一般来说,是对/src/test/resources目录内容进行变量替换等工作后,复制到项目输出的测试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
* install:将包安装到maven本地仓库中,供本地其他maven项目使用
* deploy:将最终的包复制到远程仓库,供其他开发人员和maven项目使用。
这里只是将重点的几个阶段解释了下,对于其他的可用查阅官方文档:
http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
>> site生命周期
site生命周期目的是建立和发布项目站点,maven能够基于pom所包含的信息,自动生成一个友好的站点,方便团队交流和发布项目信息。该生命周期包含如下阶段:
* pre-site:执行在生成项目站点之前需要完成的工作
* site:生成项目站点
* post-site:执行在生成项目站点之后需要完成的工作
* site-deploy:将生成的项目站点发布到服务器上
>> 命令行与生命周期
从命令行执行maven任务最主要的方式就是调用maven的生命周期阶段:
mvn clean:调用clean生命周期的clean阶段,实际是pre-clean和clean阶段
mvn test:执行default生命周期的test阶段,也就是从validate一直到test阶段
mvn clean install:执行clean生命周期到clean阶段,然后执行default生命周期到install阶段
mvn clean deploy site-deploy:不解释了。。。
>> 自定义绑定
除了还内置绑定外,用户还可以自己绑定某个插件目标到生命周期某个阶段上,比如创建项目的源码source的jar包:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>2.1.1</version> <executions> <execution> <id>attache-sources</id> <phase>verify</phase> <goals> <goal>jar-no-fork</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
插件的仓库配置:
<pluginRepositories> <pluginRepository> <id>central</id> <name>Maven Plugin Repository</name> <url>http://repo1.maven.org/maven2/</url> <layout>default</layout> <snapshots> <enabled>false</enabled> </snapshots> <releases> <updatePolicy>never</updatePolicy> </releases> </pluginRepository> </pluginRepositories>
本人博客已搬家,新地址为:http://yidao620c.github.io/