Maven的生命周期和插件(五)

jopen 9年前

前面我们已经讲过坐标、依赖以及仓库,Maven的另外两个核心概念是生命周期和插件。生命周期和插件二者协同工作,密不可分。

1. Maven生命周期基本概念

1) Maven的生命周期就是为了对所有的构建过程进行抽象和统一。Maven总结了一套高度完善的、易扩展的生命周期,包括了项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎所有的构建步骤。

2) Maven的生命周期是抽象的,生命周期本身不做任何实际的工作,在Maven的设计中,实际的任务都交给插件来完成。其实这种思想和设计模式中的模版方法(Template Method)很相似。

2. 生命周期详解

1)三套生命周期

Maven有三套相互独立的生命周期,分别为clean、default和site。clean生命周期的目的是清理项目,default生命周期的目的是构建项目,而site生命周期的目的是建立项目站点。

2)clean生命周期

clean生命周期的目的是清理项目,它包括如下三个阶段:

a)pre-clean:执行一些清理前需要完成的工作。

b)clean:清理上一次构建的文件。

c)post-clean:执行一些清理后需要完成的工作。

3) default生命周期

default生命周期定义了真正构建时所需要执行的所有步骤,它是所有生命周期中最核心的部分。

a)validate

b)initialize

c)generate-sources

d)process-sources

e)generate-resources

f) process-resources

g)compile:编译项目的主源码,即编译src/main/java目录下的Java文件至项目输出的主classpath中。

h)process-classes

i)generate-test-sources

j)process-test-sources

k)generate-test-resources

l)process-test-resources

m)test-compile:编译项目的测试代码,即编译src/test/java目录下的Java文件至项目输出的测试classpath目录中。

n)process-test-classes

o)test:使用单元测试框架运行测试。

p)prepare-package

q)package:接受编译好的代码,打包成可发布的格式。如:.jar

r)pre-integration-test

s)integration-test

t)post-integration-test

u)verify

v)install:将包安装到Maven本地仓库,供本地其他Maven项目使用。

w)deploy:将最终的包复制到远程仓库,供其他开发人员和Maven项目使用。

4) site生命周期

site生命周期的目的是建立和发布项目站点。

a)pre-site:执行一些在生成项目站点之前需要完成的工作。

b)site:生成项目站点文档。

c)post-site:执行一些在生成项目站点之后需要完成的工作。

d)site-deploy:将生成的项目站点发布到服务器上。

5)Window下的命令行执行Maven任务

主要是调用Maven的生命周期的阶段,以下几个常用的命令:

mvn clean、mvn test、mvn clean install、mvn clean deploy site-deploy。

3. 插件详解

1)插件目标

我们已经知道,Maven的核心仅仅定义了抽象的生命周期,具体的任务是交给插件完成的,插件以独立的构件形式存在的。对于插件本身,为了能够复用代码,它往往能够完成多个任务。每个任务就是一个插件目标。

2) 插件绑定

Maven的生命周期与插件是相互绑定的,用以完成实际的构建任务。具体而言,是生命周期的阶段和插件的目标相互绑定,以完成一项具体的任务。如:项目编译这一任务,它对应了default生命周期中的compile这一阶段,而maven-compiler-plugin这一插件的compile目标能够完成该任务。

3)内置绑定

Maven为一些主要的生命周期阶段绑定了很多插件目标。比如:clean生命周期中的clean阶段,与maven-clean-plugin:clean绑定。

下面我对hello-world项目执行mvn clean install命令,(本人直接使用eclipse执行,命令为clean install),看下面执行了哪些插件目标:

[INFO] Scanning for projects...  [INFO]                                                                           [INFO] ------------------------------------------------------------------------  [INFO] Building hello-world 0.0.1-SNAPSHOT  [INFO] ------------------------------------------------------------------------  [INFO]   [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ hello-world ---  [INFO] Deleting D:\code\maven\hello-world\target  [INFO]   [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ hello-world ---  [WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!  [INFO] skip non existing resourceDirectory D:\code\maven\hello-world\src\main\resources  [INFO]   [INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ hello-world ---  [WARNING] File encoding has not been set, using platform encoding GBK, i.e. build is platform dependent!  [INFO] Compiling 1 source file to D:\code\maven\hello-world\target\classes  [INFO]   [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ hello-world ---  [WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!  [INFO] skip non existing resourceDirectory D:\code\maven\hello-world\src\test\resources  [INFO]   [INFO] --- maven-compiler-plugin:2.5.1:testCompile (default-testCompile) @ hello-world ---  [WARNING] File encoding has not been set, using platform encoding GBK, i.e. build is platform dependent!  [INFO] Compiling 1 source file to D:\code\maven\hello-world\target\test-classes  [INFO]   [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ hello-world ---  [INFO] Surefire report directory: D:\code\maven\hello-world\target\surefire-reports    -------------------------------------------------------   T E S T S  -------------------------------------------------------  Running com.alvinliang.maven.HelloWorldTest  Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.067 sec    Results :    Tests run: 1, Failures: 0, Errors: 0, Skipped: 0    [INFO]   [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ hello-world ---  [INFO] Building jar: D:\code\maven\hello-world\target\hello-world-0.0.1-SNAPSHOT.jar  [INFO]   [INFO] --- maven-install-plugin:2.4:install (default-install) @ hello-world ---  [INFO] Installing D:\code\maven\hello-world\target\hello-world-0.0.1-SNAPSHOT.jar to D:\library\maven\repository\com\alvinliang\maven\hello-world\0.0.1-SNAPSHOT\hello-world-0.0.1-SNAPSHOT.jar  [INFO] Installing D:\code\maven\hello-world\pom.xml to D:\library\maven\repository\com\alvinliang\maven\hello-world\0.0.1-SNAPSHOT\hello-world-0.0.1-SNAPSHOT.pom  [INFO] ------------------------------------------------------------------------  [INFO] BUILD SUCCESS  [INFO] ------------------------------------------------------------------------  [INFO] Total time: 5.715s  [INFO] Finished at: Mon Jan 20 22:28:09 CST 2014  [INFO] Final Memory: 16M/167M  [INFO] ------------------------------------------------------------------------

4)自定义绑定

除了内置绑定外,用户可以自己选择将某个插件目标绑定到生命周期的某个阶段上。例如:创建项目的源码,没有对应的内置绑定,这时候就需要用户自己自定义绑定。

4. 插件的配置

1)命令行插件配置

用户可以在Maven命令中使用-D参数,并伴随一个参数键=参数值的形式,来配置插件的参数。

如:mvn install -Dmaven.test.skip = true

2)Eclipse中执行 install -Dmaven.test.skip = true,结果如下:

[INFO] Scanning for projects...  [INFO]                                                                           [INFO] ------------------------------------------------------------------------  [INFO] Building hello-world 0.0.1-SNAPSHOT  [INFO] ------------------------------------------------------------------------  [INFO]   [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ hello-world ---  [WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!  [INFO] skip non existing resourceDirectory D:\code\maven\hello-world\src\main\resources  [INFO]   [INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ hello-world ---  [INFO] Nothing to compile - all classes are up to date  [INFO]   [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ hello-world ---  [INFO] Not copying test resources  [INFO]   [INFO] --- maven-compiler-plugin:2.5.1:testCompile (default-testCompile) @ hello-world ---  [INFO] Not compiling test sources  [INFO]   [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ hello-world ---  [INFO] Tests are skipped.  [INFO]   [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ hello-world ---  [INFO]   [INFO] --- maven-install-plugin:2.4:install (default-install) @ hello-world ---  [INFO] Installing D:\code\maven\hello-world\target\hello-world-0.0.1-SNAPSHOT.jar to D:\library\maven\repository\com\alvinliang\maven\hello-world\0.0.1-SNAPSHOT\hello-world-0.0.1-SNAPSHOT.jar  [INFO] Installing D:\code\maven\hello-world\pom.xml to D:\library\maven\repository\com\alvinliang\maven\hello-world\0.0.1-SNAPSHOT\hello-world-0.0.1-SNAPSHOT.pom  [INFO] ------------------------------------------------------------------------  [INFO] BUILD SUCCESS  [INFO] ------------------------------------------------------------------------  [INFO] Total time: 2.481s  [INFO] Finished at: Mon Jan 20 22:35:59 CST 2014  [INFO] Final Memory: 13M/100M  [INFO] ------------------------------------------------------------------------

5. 使用maven-help-plugin描述插件

在cmd中执行mvn help:describe -Dplugin=compiler,结果如下:

[INFO] --- maven-help-plugin:2.2:describe (default-cli) @ standalone-pom ---  [INFO] org.apache.maven.plugins:maven-compiler-plugin:3.1    Name: Maven Compiler Plugin  Description: The Compiler Plugin is used to compile the sources of your    project.  Group Id: org.apache.maven.plugins  Artifact Id: maven-compiler-plugin  Version: 3.1  Goal Prefix: compiler    This plugin has 3 goals:    compiler:compile    Description: Compiles application sources    compiler:help    Description: Display help information on maven-compiler-plugin.      Call mvn compiler:help -Ddetail=true -Dgoal=<goal-name> to display      parameter details.    compiler:testCompile    Description: Compiles application test sources.    For more information, run 'mvn help:describe [...] -Ddetail'


来自: http://my.oschina.net/liangbo/blog/194581