读maven官方文档的收获
一. 构建生命周期基础
1. 构建生命周期基础
Maven基于构建生命周期的核心概念。这意味着构建和分配一个特定的artifact(project)是明确定义的。这里有三种内置的构建生命周期:default, clean和site。这个default构建周期管理项目部署;clean构建周期管理项目清理;site构建周期管理项目站点文档的创建。
2. 一个maven构建的生命周期由多个阶段构成
每个maven的生命周期都由不同的阶段组成。例如,default生命周期由下面几个阶段组成:
- validate 验证项目的正确性以及所有必要的信息都可用
- compile 编译项目的源代码
- test 使用合适的单元测试框架测试编译的源代码。这些测试不应要求打包或部署
- package 获得编译后的代码并将其打包成可分发的格式,例如JAR的格式
- verify 对集成测试的每一项结果进行检查,以确保满足质量要求
- install 将包安装到本地仓库中,作为本地其它项目的依赖使用
- deploy 构建环境完成,将最终包复制到远程仓库,以便与其它开发者和项目共享
3. 常用的命令行调用
在开发环境,使用如下命令构建和安装artifacts到本地仓库:
mvn install
在构建环境中,使用以下调用将干净地构建并部署artifacts到共享的仓库中,在多模块方案中同样可以使用此命令:
mvn clean deploy
4. 一个构建阶段由plugin goals组成
虽然一个构建阶段负责构建生命周期中具体的一步,但是执行这些职责的方式可能多种多样。这是通过声明绑定到这些构建阶段的插件目标实现的。一个插件目标代表一个特定的任务(比一个构建阶段更精细),它有助于项目的构建和管理。一个插件目标可能绑定到零个或多个构建阶段,未绑定到任何构建阶段的目标可以直接在构建生命周期之外直接调用执行。
plugin goals的执行顺序取决于目标和构建阶段的调用顺序。比如下面这一个命令,clean和package参数是构建阶段,而dependency:copy-dependendies是一个plugin goal:
mvn clean dependency:copy-dependencies package
如果这个命令被执行,clean将被首先运行(包含clean的之前所有阶段还有clean本身),然后dependency:copy-dependencies插件目标被执行,最终就是package语句(包含package之前的所有阶段和package本身)。另外,如果一个插件目标绑定到多个构建阶段,那么它将在这些阶段中都会被调用。除此之外,如果一个构建阶段没有插件目标绑定到它身上,这个构建阶段不会被执行。
5. 如何使用构建生命周期配置你的项目
构建生命周期的含义非常简单。那么当你在给项目创建maven构建时,如何将任务分配给每一个构建阶段?
Packaging:
第一种也是最常用的方式,通过POM元素<packaging>给你的项目设置打包方式。有效的打包方式有:jar,war,ear和pom。如果没有设置打包方式,将会默认为jar。
每一个打包包含一些绑定到指定构建阶段的目标。例如,jar的打包会绑定下面几个目标到default生命周期的各个构建阶段:
Phase(阶段) | plugin:goal |
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 |
请注意,对于某些打包方式,可能需要在POM的<build>部分包含一个特定的插件,并且设置<extensions>true</extensions>。举一个例子就是Plexus plugin,它提供了plexus-application和plexus-service打包。
Plugins:
第二种在构建阶段添加plugin goals的方法是在项目中配置plugins。Plugins是为maven提供plugin goals的工件,另外,一个plugin可能包含一个或多个goals,每一个goal代表plugin的一个功能。例如,Compiler plugin包含两个goals:compile和testCompile,前一个编译主程序的源代码,后一个编译测试代码。
配置的goals将会被添加到所选打包中早已绑定到生命周期的goals。如果将多个目标绑定到指定阶段,那么执行顺序是首先执行packaging方式的goals,然后执行在POM中配置的那些。当然,可以使用<executions>元素对特定goal的执行顺序进行掌控。例如,Modello plugin默认情况下将它的goal——modello:java绑定到generate-sources阶段,所以为了使用Modello plugin,让它从模型中生成源代码,你将会添加如下代码到你的POM文件中<build>的<plugins>部分。
....
<plugin>
<groupId>org.codehaus.modello</groupId>
<artifactId>modello-maven-plugin</artifactId>
<version>1.8.1</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>元素,这样可以支持以不同的配置运行同样的goal。可以给每一个execution一个单独的ID,这样可以控制goal配置是合并还是转换为附加执行。当给定多个与构建阶段匹配的execution时,它们按照POM中指定的顺序执行,被继承的execution优先。除此之外,你可以给goal指定一个构建阶段,假如你有一个goal——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>
...
二. POM简介
1. POM是什么?
POM(Project Object Model),是maven中的基本工作单元。它是一个XML文件,包含项目信息和aven用于构建项目的详细配置信息。
2. Super POM
Super Pom是maven的默认POM文件,所有的POM文件都继承自Super POM除非你明确设置。
3. Minimal POM
POM文件的最低要求是:
- project root
- modelVersion 4.0.0
- groupId
- artifactId
- version
4. 项目继承
会合并的POM元素如下:
- dependencies
- developers and contributors
- plugin lists(包含报告)
- plugin executions with matching ids
- plugin configuration
- resources
关于项目继承的实例请直接参照官方文档:http://maven.apache.org/guides/introduction/introduction-to-the-pom.html
5. 项目聚合
项目聚合与项目继承类似,但它不是从模块中指定parent POM,而是从parent POM中指定其模块。这样,parent POM就知道它有哪些模块了,并且如果一个maven命令在父项目上执行,其相应的模块也会被执行。
项目聚合有以下要求:
- 将parent POM的打包方式设置为"pom"
- 在parent POM中指定包含模块的路径(也就是children POMs)
6. 项目继承VS项目聚合
如果你有几个maven项目,并且它们有一些相同的配置。你可以重构你的项目,将那些相同的配置抽出来做成一个父项目。
如果你有一组项目要在一起构建,你可以先创建一个父项目,并在父项目中声明这些项目为它的模块。这样,你就只需构建父项目,其包含的模块也会随之构建。
当然,也可以让项目继承和项目聚合同时进行。也就是说,你可以为你的子模块指定一个父项目,同时在父项目中指定那些maven项目为其子模块。
7. 项目插值与变量
Maven鼓励不要重复配置,但是有时候又需要在不同的地方使用相同的值。为了避免变量的重复指定,Maven允许指定你自己的或者预先编译的变量。例如,为了获取project.version的值,可以这样引用:
<version>${project.version}</version>
需要考虑的一个因素是,这些变量是在继承之后处理的。这意味着如果一个父项目使用了一个变量,那么这个变量在子项目中的定义才是它最终会使用的。
(三)关于Maven的基本简介
1. 有哪些配置以及配置在哪
每个项目:在POM中配置(pom.xml)
每个用户:(%USER_HOME%/.m2/settings.xml)
全球配置:定义在(${maven.home}/conf/settings.xml)
2. 如何触发配置文件?使用不同的配置文件有什么区别?
触发配置文件有如下几种方法:
- 显式的
- 通过Maven配置
- 基于环境变量
- 基于操作系统设置
- 缺省配置
具体说明:
通过 -P 命令可以指定配置:
mvn groupId:artifactId:goal -P profile-1,profile-2
配置文件可以在Maven配置文件中激活,通过<activeProfiles>标签,这个标签可以包含一系列的<activeProfile>元素,每一个元素包含一个profile-id:
<settings> ... <activeProfiles> <activeProfile>profile-1</activeProfile> </activeProfiles> ... </settings>