本文转自:http://www.cnblogs.com/holbrook/archive/2012/12/24/2830519.html
maven是一个软件工程(Software Project)管理工具。 对于maven来说,一个软件工程的唯一标识是由开发者(groupId)、生成物(artifactId)、版本(version) 共同决定的。
每个工程都有一个打包类型,可以是jar, war, ear 或 pom。打包类型决定了工程最终产物的类型。 其中pom类型用于构件多模块工程。
工程之间有两种关系:依赖和聚合。
1.1 工程依赖关系
依赖关系的管理是maven最为人称道的地方。一个工程可以依赖多个其他工程, 通过工程的唯一标识(groupId+artifactId+version)可以明确指明依赖的库及版本,而且能够处理 依赖关系的传递。 maven可以指定依赖的作用范围(scope),包括以下几种:
scope | 编译期 | 测试期 | 运行期 | 说明 |
compile | V | V | V | 默认scope |
test | V | 只在测试期依赖,如junit包 | ||
provided | V | V | 运行期由容器提供,如servlet-api包 | |
runtime | V | V | 编译期间不需要直接引用 | |
system | V | V | 编译和测试时由本机环境提供 |
由于依赖关系的传递性可能会导致依赖的版本、scope等发生冲突,maven提供了仲裁机制,同时也 允许自己通过配置进行依赖管理。
1.2 继承聚合关系
继承主要为了消除重复,把相同的配置提前出来
聚合主要为了快速构建项目
子项目加入如下代码实现与父工具的继承关系
<parent>
<groupId>cn.itcast.mavengroupId>
<artifactId>ParentartifactId>
<version>0.0.1-SNAPSHOTversion>
<relativePath>../Parent/pom.xmlrelativePath>
parent>
父工程实际是一个聚合工程,它没有实际代码,它的作用是抽象出子工程公用的内容,pom文件中< packaging >jar< /packaging> 改为 < packaging>pom< /packaging>
如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合。
在父工程中加入如下代码实现与子工程的聚合关系
<module>../Hello</module>
<module>../HelloFriend</module>
<module>../MakeFriends</module>
</modules>
这样子工程就无需一个一个的安装 mvn install,只需在父工程 pom.xml上执行命令,就会连同全部一起进行安装
maven将工程(Project)的构建过程理解为不同的生命周期(LifeCycle)和阶段(Phase)。 在工程的构建过程中,存在着不同的生命周期,这些生命周期互相独立,之间也没有一定的顺序关系。 每个生命周期又划分为不同的阶段(Phase)。阶段之间有明确的顺序关系,同一生命周期内的阶段必须按顺序依次执行。也就是说,在一个生命周期中,运行某个阶段的时候,它之前的所有阶段都会被运行,例如:执行mvn clean 等同于执行mvn pre-clean clean ;如果我们运行 mvn post-clean ,那么 pre-clean,clean 都会被运行。
maven内置了三个生命周期,并为每个生命周期内置了一些阶段。 下面列举出maven内置的生命周期及主要的阶段:
default:构建(Build)
validate:验证项目是否正确,所有必需的信息是否可用。
compile:编译项目中的代码。
test:用相关的单元测试框架测试编译后的代码,这些运行的测试并不会随项目打包和布署。
package:将编译后的代码打包成相应的格式文件,如jar包。
integration-test: 如果需要在一个综合环境中运行我们的测试,这个阶段将会运行和布署项目到该环境中。
verify: 检查项目的包是否正确和符合要求。
install:将包安装到本地maven仓库,可以让其他项目作为依赖使用该包。
deploy:将包发布到远程的maven仓库,并提供给其他开发者使用。
clean:清理
pre-clean 准备清理
clean 执行清理工作
post-clean 执行清理后的后续工作
site:生成项目文档和站点
pre-site 准备生成
site 生成项目站点和文档
post-site 执行生成文档后的后续工作
site-deploy 发布项目文档
更详细的phase说明参考: http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Lifecycle_Reference
Maven中定义的工程周期和阶段只是抽象的概念,不涉及具体的功能。 具体的功能由插件(Plugin)实现。一个插件可以实现多个目标(Goal)。
为了解耦插件的功能和工程阶段,实现高度的可配置性,maven规定插件只是实现目标的功能, 通过配置来决定在哪个阶段执行(Execution)哪些目标操作。 甚至可以把一个Goal绑定到多个Phase,以实现复用。
maven内置了一些默认的插件,并根据不同的工程packing类型在各个phase中默认绑定了一些goal。 下表中列出default生命周期中各阶段默认绑定的goal,其中goal按照管理使用pluginname:goalname的方式标记:
Pahse | Plugin:Goal |
process-resources | resources:resources |
compile | compiler:compile |
process-test-resources | resources:testResources |
test-compile | compiler:testCompile |
test | surefire:test |
package | ejb:ejb/ejb3:ejb3/jar:jar/par:par/rar:rar/war:war |
install | install:install |
deploy | deploy:deploy |
最后需要说明的是,maven的插件是一种packaging类型为maven-plugin的project, 可以使用maven project的依赖,配置插件等等一切特性。
仓库主要用于获取工程依赖的其他工程的生成物,也可用来部署(deploy)maven工程的生成物。 生成物包括各种打包的生成物以及pom文件。
如果有必要,一个工程可以部署到多个仓库。
仓库可以分为本地库(local)和远程库(remote)。本地库通常位于本机的~/.m2/repository文件夹, 远程库最常见的是maven中央库(http://repo1.maven.org/maven2),此外也会有一些私服库用于企业内部。
http://repository.jboss.com/maven2/
本文梳理了maven的核心概念,整个maven核心概念的全貌如下:
概念 | 说明 |
LifeCycle | 生命周期,maven内置default,site,clean三个生命周期 |
Phase | 阶段,每个生命周期有不同的阶段 |
Plugin | 插件,实现实际的构建功能 |
Goal | 一个插件可以实现多个goal,goal具备具体的功能 |
Execution | 通过配置,决定在某个Phase执行哪些Goal |
Project | maven管理的目标:软件工程,小的工程可以聚合成大工程 |
PackageType | 为了便于管理工程,按照构建目标区分成不同的工程类型,如jar,war,ear等 |
Dependency | 依赖,project之间存在依赖关系 |
DependencyScope | maven对依赖定义了不同的作用范围 |
Management | 可以配置一个工程如何管理依赖关系 |
Repository | 仓库,存放包,分为本地库和远程库 |
Build | 构建的动作。使用maven管理工程,主要是指定将project构建到某个phase |