理解maven的核心概念
原文出处:http://www.cnblogs.com/holbrook/archive/2012/12/24/2830519.html
好久没进行java方面的开发了,最近又完成了一个java相关的任务,顺便重新体会了 maven 这一利器。
在使用过程中发现以前对maven的理解不够深入,借此机会重新梳理了一下maven的核心概念。相信理解了这些核心概念, 即使长时间不使用,以后再重新上手也会非常容易。
本文以类图的方式,介绍maven核心的12个概念以及相互之间的关系。
Table of Contents
1 maven管理的目标:工程(Project)

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 工程聚合关系
前面提到pom类型用于于构件多模块工程,这体现了project之间的一种聚合关系: 将一系列小的模块聚合成整个产品。
通过聚合后的工程可以同时管理每个相关模块的构建、清理、文档等工作。 聚合关系通过在子工程中指定一个pom类型的project作为父project来定义。
2 maven的核心:生命周期和阶段

maven将工程(Project)的构建过程理解为不同的生命周期(LifeCycle)和阶段(Phase)。 在工程的构建过程中,存在着不同的生命周期,这些生命周期互相独立,之间也没有一定的顺序关系。 每个生命周期又划分为不同的阶段(Phase)。阶段之间有明确的顺序关系, 同一生命周期内的阶段必须按顺序依次执行。
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
3 功能实现:插件和Goal

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的依赖,配置插件等等一切特性。
4 仓库(Repository)
仓库主要用于获取工程依赖的其他工程的生成物,也可用来部署(deploy)maven工程的生成物。 生成物包括各种打包的生成物以及pom文件。
如果有必要,一个工程可以部署到多个仓库。
仓库可以分为本地库(local)和远程库(remote)。本地库通常位于本机的~/.m2/repository文件夹, 远程库最常见的是maven中央库(),此外也会有一些私服库用于企业内部。
5 小结
本文梳理了maven的核心概念,整个maven核心概念的全貌如下:

| 概念 | 说明 |
|---|---|
| LifeCycle | 生命周期,maven内置default,sie,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 |
Author: Holbrook Wong <holbrook@holbrook.imac>
Date: 2012-12-24 09:20:24 CST
HTML generated by org-mode 6.33x in emacs 23
理解maven的核心概念的更多相关文章
- Docker入门——理解Docker的核心概念
1 前言 相信不少人听过这么一句话: 人类的本质是复读机. 在软件开发领域也一样,我们总是想寻找更好地方式复制优秀的逻辑或系统.最核心的方法是抽取通用逻辑和组件,把差异化的东西接口化或配置化,达到复用 ...
- Maven学习(四)-- Maven的核心概念
摘自:http://www.cnblogs.com/xdp-gacl/p/4051819.html 一.Maven坐标 1.1.什么是坐标? 在平面几何中坐标(x,y)可以标识平面中唯一的一点. 1. ...
- maven的核心概念
1 简单的核心概念 1.1 坐标 groupId.artifactId.version,很简单,这三个坐标定位到了该依赖的位置,有了它们就可以下载该依赖了. 1.2 依赖 如果一个jar包使用了另外一 ...
- 消息中间件——RabbitMQ(六)理解Exchange交换机核心概念!
前言 来了解RabbitMQ一个重要的概念:Exchange交换机 1. Exchange概念 Exchange:接收消息,并根据路由键转发消息所绑定的队列. 蓝色框:客户端发送消息至交换机,通过路由 ...
- maven的核心概念——生命周期
第十一章生命周期 11.1 什么是Maven的生命周期 ●Maven生命周期定义了各个构建环节的执行顺序,有了这个清单,Maven就可以自动化的执行构建命令了. ●Maven有三套相互独立的生命周期, ...
- 轻松理解 Kubernetes 的核心概念
Kubernetes 迅速成为云环境中软件部署和管理的新标准. 与强大的功能相对应的是陡峭的学习曲线. 本文将提供 Kubernetes 的简化视图,从高处观察其中的重要组件,以及他们的关联. 硬件 ...
- Maven 梳理 - 核心概念
Maven坐标 依赖配置 依赖范围 依赖范围scope用来控制依赖和编译,测试,运行的classpath的关系. 主要的是三种依赖关系如下: 1.compile: 默认编译依赖范围.对于编译,测试,运 ...
- Maven入门-2.Maven一些核心概念介绍
1.Maven仓库2.Maven坐标3.Maven插件和目标4.Maven生命周期4.1 clean:清理项目4.2 default:构建项目(重要)4.3 site:建立项目站点 1.Maven仓库 ...
- maven的核心概念——依赖
一.STS集成maven(以下是mac版的STS) 1.点击Spring Tool Suite,点击preferences maven中的installations 点击add,选择对应的路径即可 点 ...
随机推荐
- 【转】sublime text 3 显示空格和Tab
因为sublime text3确实太好用了所以也用它写代码了,可是在Python3第一步把preferences.sublime-setting-Default里面的"draw_white_ ...
- BIOS 品牌快捷键
主板品牌 启动按键 笔记本品牌 启动按键 台式机品牌 启动按键 华硕主板 F8 联想笔记本 F12 联想台式机 F12 技嘉主板 F12 宏基笔记本 F12 惠普台式机 F12 微星主板 F11 华硕 ...
- Centos7下配置Python3和Python2共存,以及对应版本Ipython安装配置
1.查看是否已经安装Python Centos7默认安装了python2.7.5 因为一些命令要用它比如yum 它使用的是python2.7.5. 使用python -V命令查看一下是否安装Pytho ...
- Qt5.3.1 OpenCV2.4.9 开发环境配置
首先是将我们需要的三个软件安装:分别是OpenCV2.4.9.QT5.3.1 .Cmake3.0.2 一定要使用Cmake3.0.2编译OpenCV2.4.9 其他版本的不一定能编译成功!!!! A. ...
- 微信小程序之自定义toast弹窗
微信小程序里面的自带弹窗icon只有两种,success和loading.有时候用户输入错误的时候想加入一个提醒图标,也可以使用wx.showToast中的image来添加图片达到使用自定义图标的目的 ...
- smtplib 报错501
昨天用stmplib写了一个自动发送的邮件的小程序. 之前能够正常运行,到了下午发现报错. 报错信息:smtplib.SMTPSendRefused(501,b'\xc7\xeb\xb5\xc7\xc ...
- C# 获取当前方法的名称空间、类名和方法名称
1.(new StackTrace()).GetFrame(1) // 0为本身的方法:1为调用方法2.(new StackTrace()).GetFrame(1).GetMethod().Name; ...
- 洛谷 P1028 数的计算【递推】
P1028 数的计算 题目描述 我们要求找出具有下列性质数的个数(包含输入的自然数n): 先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理: 1.不作任何处理; 2.在它 ...
- 【批处理学习笔记】第十二课:常用DOS命令(2)
文件管理type 显示文本文件的内容.copy 将一份或多份文件复制到另一个位置.del 删除一个或数个文件.move 移动文件并重命名文件和目录.(Windows XP Home Edition中没 ...
- 2017 ECJTU ACM 程序设计竞赛
大厦 Time Limit : 4000/2000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other) Total Submission ...