文档章节

理解maven的核心概念

Galy_绿
 Galy_绿
发布于 2015/12/19 23:30
字数 1817
阅读 189
收藏 12

好久没进行java方面的开发了,最近又完成了一个java相关的任务,顺便重新体会了 maven 这一利器。

在使用过程中发现以前对maven的理解不够深入,借此机会重新梳理了一下maven的核心概念。相信理解了这些核心概念, 即使长时间不使用,以后再重新上手也会非常容易。

本文以类图的方式,介绍maven核心的12个概念以及相互之间的关系。

Table of Contents 1 maven管理的目标:工程(Project) 1.1 工程依赖关系 1.2 工程聚合关系 2 maven的核心:生命周期和阶段 3 功能实现:插件和Goal 4 仓库(Repository) 5 小结 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中央库(),此外也会有一些私服库用于企业内部。

http://repository.jboss.com/maven2/

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

本人已在github上用Jekyll建立了新的博客:http://thinkinside.tk/,本站文章会陆续迁移过去

本文转载自:http://www.cnblogs.com/holbrook/archive/2012/12/24/2830519.html

共有 人打赏支持
Galy_绿
粉丝 12
博文 133
码字总数 14908
作品 0
海淀
私信 提问

暂无文章

徒手撸一个简单的RPC框架

徒手撸一个简单的RPC框架 之前在牛逼哄哄的 RPC 框架,底层到底什么原理得知了RPC(远程过程调用)简单来说就是调用远程的服务就像调用本地方法一样,其中用到的知识有序列化和反序列化、动态...

不学无数的程序员
32分钟前
1
0
Java 面试题目最全集合1000+ 大放送,能答对70%就去BATJTMD试试~

2019,相对往年我们会发现今年猎头电话少了,大部分企业年终奖缩水,加薪幅度也不如往年,选择好offer就要趁早,现在开始准备吧,刷一波Java面试题,能回答70%就去BATJTMD大胆试试~ 以下是2...

mikechen优知
37分钟前
2
0
玩转Koa之核心原理分析

Koa作为下一代Web开发框架,不仅让我们体验到了async/await语法带来同步方式书写异步代码的酸爽,而且本身简洁的特点,更加利于开发者结合业务本身进行扩展。 本文从以下几个方面解读Koa源码...

前端小攻略
38分钟前
1
0
分布式之数据库和缓存双写一致性方案解析

为什么写这篇文章? 首先,缓存由于其高并发和高性能的特性,已经在项目中被广泛使用。在读取缓存方面,大家没啥疑问,都是按照下图的流程来进行业务操作。 ![] 但是在更新缓存方面,对于更新...

hensemlee
今天
5
0
怎么学习大数据

最近有很多人在找,大数据是怎么学?需要学什么技术以及这些技术的学习顺序是什么?今天有时间我把个问题总结成文章分享给大家。 那大数据处理技术怎么学习呢?首先我们要学习Java语言和Lin...

董黎明
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部