概念:生命周期,建造过程,目标。
+ 建造的生命周期基础
Maven 2.0 的中心概念就是建造的生命周期。项目成品的建造和分发的过程被明确定义。
对于建造一个项目的个人来讲,需要做的事情就是学习一些建造Maven项目的简单命令,以及POM,确保得到想要的结果。
有三个内建的建造生命周期:default, clean 和 site。defalut 生命周期处理你的项目的部署,clean 生命周期处理项目的清理,site生命周期处理你的项目站点文档的创建。
++ 一个建造的生命周期是由过程组成
每一个建造生命周期由一系列不同的建造过程组成,建造过程表现为生命周期的一个阶段。
例如,default 生命周期拥有下面的建造过程(要获得完成的建造过程的列表 ,参考 “生命周期参考”):
• validate – 检查项目的正确性和所需的信息是否有效
• compile – 编译项目的源代码
• test – 使用适合的单元测试框架来测试编译后的源代码。这些测试不需要代码被打包或者部署
• package – 将编译后的代码打包成为可分发的格式,例如一个JAR
• integration-test – 根据需要,处理和部署包到一个环境,那里进行集成测试
• verify – 执行一些检查,验证包是否有效并且符合质量要求
• install – 安装包到本地仓库,为让其他的项目可以依赖
• deploy – 在一个集成获得发行的环境完成,拷贝最终的包到远程仓库,与其他的开发者或者项目共享
这些建造过程(增加的其他建造过程没有在这里展示)按照一定的顺序执行,来完成default生命周期。上面给出的建造过程,这表示当default生命周期被使用,Maven将首先检查项目,然后尝试编译源代码,运行相关的测试,打包二进制文件,运行集成测试,验证包,安装验证后的包到本地仓库,然后在一个指定的环境部署安装的包。
要完成上面所有的任务,你仅仅需要调用最后的建造过程,在这个例子中,就是 deploy :
mvn deploy
这是因为你调用这个建造过程,不仅仅指定的建造过程被执行,哪些排在该建造过程前面的所有建造过程都会被执行。因此,执行
mvn integeration-test
将执行所有在它之前的建造过程(validate,compile,package,等等)。
这个生命周期还有很多建造过程,将在下面的章节讨论。
同样要注意的是,同样的命令可以在一个多模块的情景中使用(例如,一个项目有一个或者多个子项目)。例如:
mvn clean install
这个命令也会在所有的子项目中执行 clean, 然后是 instlal (包括所有前面的步骤)。
++ 建造过程是由一组目标组成
然而,构建过程负责建造生命周期的一个具体的步骤,以何种方式履行这些责任可能有所不同,因此,通过声明一些目标来绑定到这些建造过程的方法来完成。
一个目标表现为一个具体的任务(细于建造过程)有利于项目的建造和管理。它可以被绑定到零到多个建造过程。没有绑定到建造过程的目标可以在建造生命周期之外以直接调用的方式执行。执行的顺序依赖于目标的顺和被调用的建造过程s。例如,考虑下面的命令。clean 和 package 参数一个建造过程,而 dependency:copy-dependencies 是一个目标。
mvn clean dependency:copy-dependencies package
clean 过程首先被执行(这表示clean生命周期签名的所有前面的过程都被执行,加上 clean 本身),然后是 dependency:copy-dependencies 目标,最后执行 package 过程(default生命周期所有前面的过程被执行,包括package本身)。
此外,如果一个目标被绑定到多个建造过程,这个目标将在所有这些过程中被调用。
一个建造过程可以被绑定零个或者多个目标。如果一个建造过程没有绑定任何目标,那么这个建造过程将不会被执行。但如果绑定了一个获得多个目标,它将执行所有的目标(注意:在 Maven 2.0.5 和以上的版本,多个绑定到同一个过程的目标是按照POM里面声明的顺序来执行,然而,同一个插件的多个实例并不会被支持。在Maven 2.0.11 和以上的版本,同一个插件的多个实例被分组执行和排序)。
+ 设置你的项目让其使用建造生命周期
建造生命周期用起来很简单,但当你给一个项目构造一个Maven建造,你如何给这些建造过程赋予任务呢?
++ 打包
首先,最通用的方式,通过POM的元素
每一种打包都包含一系列的目标,绑定到一个具体的过程。例如, jar 打包将绑定下面的目标到 default 生命周期的建造过程。
• process-resources resources:resources
• compile compiler:compile
• process-test-resources resources:testResources
• test-compile compiler:testCompile
• test surefire:test
• package jar:jar
• install install:install
• deploy deploy:deploy
这几乎是标准绑定的集合;然而,有些打包的处理是很不一样的。例如一个项目是纯 metadata(打包值是 pom),仅仅绑定目标到 install 和 deploy 过程(要获得一个完成的列表,关于一些打包类型的目标到建造过程,参考生命周期参考)。
注意,为了让一些打包类型有效,你需要在你的POM的
一个插件的例子,需要Plexus 插件,它提供一个 plexus-application 和 plexus-service 打包。
++ Plugins
第二种增加目标到建造过程的方法就是在你的项目中配置插件。插件是成品,它给Maven提供目标。一个插件可以有一个或者多个目标,每一个目标表现该插件的一种能力。例如 Compiler 插件有两个目标:compile 和 testCompile。前一个编译你的主要源代码,后一个编译你的测试的代码。
在后面你将看到,插件可以获得信息,指明哪些生命周期过程绑定哪些目标。注意的是,仅仅增加给它自己增加插件是不够的,还需要指明哪些目标是你的建造的一部分。
配置好的目标将增加到已经绑定到生命周期的目标。如果不止一个目标绑定到某个过程,首先执行的是来自打包的,然后是哪些在POM中配置的。注意,你可以使用
例如,Modello插件缺省绑定它的目标 modelo:java 到生成源代码的 过程(注意: modello:java 目标生成 Java 源代码)。因此使用 Modello 插件,使用它从一个模型和组合到构建中,你需要增加下面的内容到POM的
…
<plugin>
<groupId>org.codehaus.modello</groupId>
<artifactId>modello-maven-plugin</artifactId>
<version>1.4</version>
<executions>
<execution>
<configuration>
<models>
<model>src/main/mdo/maven.mdo</model>
</models>
<version>4.0.0</version>
</configuration>
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
</plugin>
…
当匹配一个具体过程的多个executions给出,他们将按照POM中指定的顺序执行,继承的executions将首先运行。
现在,在 modello:java 的例子中,仅仅在 generate-sources 过程中有意义。但有些目标不仅仅能在一个过程中使用,缺省这可能是不合理的。对于这个,你可以自己指定过程。例如,你有一个目标 display:time ,在命令行上显示当前时间,你想让它运行在 process-test-resources 过程中,来指明什么时候测试开始。这个配置如下:
…
<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>
…
+ 生命周期参考
下面列出default,clean 和 site 三个生命周期的所有建造过程,根据指定的点,执行的顺序和列出的顺序一致。
++ Clean Lifecycle
• pre-clean 在实际的项目清理前执行。
• clean 清理上次建造过程中产生的所有文件。
• post-clean 在项目清理后执行。
++ Default Lifecycle
• validate 检查项目是否正确,所需要的信息是否有效。
• initialize 初始化建造的状况,例如设置属性或者创建目录s。
• 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 编译测试代码,放入测试目标目录。
• process-test-classes 对编译后的生成的测试文件进行后期处理,例如对Java类进行字节增强。Maven 2.0.5 和以上。
• test 使用测试框架进行单元测试。这些测试不需要代码打包或部署。
• prepare-package 打包前的准备。根据具体需要。通常是解包,处理不同包的不同版本。
• package 打包编译后的代码,以可发布的格式,例如一个JAR。
• pre-integration-test 集成测试前的准备。可能包括设置需要的环境。
• integration-test 处理和部署包到一个可以进行集成测试的环境。
• post-integration-test 集成测试后处理。可能包含清理环境的操作。
• verify 检验包的有效性,是否符合质量的要求。
• install 在本地仓库安装包,给使用这个依赖的本地项目使用。
• deploy 在一个集成或者发行环境中完成。拷贝最终的包到远程仓库,共享给其他的开发者和项目。
++ Site Lifecycle
• pre-site 在站点文档生成前执行。
• site 生成项目的站点文档。
• post-site 在站点文档生成后执行,准备站点的俄部署。
• site-deploy 部署生成的站点文档到远程的Web服务器。
+ 内建的生命周期绑定
缺省,一些过程拥有绑定到本身的目标。对于default生命周期,这些绑定依赖打包值。下面是一些 目标到建造过程的绑定。
++ Clean Lifecycle Bindings
• clean clean:clean
++ Default Lifecycle Bindings – Packaging ejb / ejb3 / jar / par / rar / war
• process-resources resources:resources
• compile compiler:compile
• process-test-resources resources:testResources
• test-compile compiler:testCompile
• test surefire:test
• package ejb:ejb or ejb3:ejb3 or jar:jar or par:par or rar:rar or war:war
• install install:install
• deploy deploy:deploy
++ Default Lifecycle Bindings – Packaging ear
• generate-resources ear:generateApplicationXml
• process-resources resources:resources
• package ear:ear
• install install:install
• deploy deploy:deploy
++ Default Lifecycle Bindings – Packaging maven-plugin
• generate-resources plugin:descriptor
• process-resources resources:resources
• compile compiler:compile
• process-test-resources resources:testResources
• test-compile compiler:testCompile
• test surefire:test
• package jar:jar and plugin:addPluginArtifactMetadata
• install install:install and plugin:updateRegistry
• deploy deploy:deploy
++ Default Lifecycle Bindings – Packaging pom
• package site:attach-descriptor
• install install:install
• deploy deploy:deploy
++ Site Lifecycle Bindings
• site site:site
• site-deploy site:deploy
++ References
完整的Maven生命周期在模块 maven-core 文件components.xml中定义,可通过 Maven 2.2.0 和 Maven 3.0.x 的 SVN分支查看。