什么是Maven
# 00.什么是Maven
Maven 音标 [ˈmeɪvən], 这个单词来自于犹太语,可以翻译为“知识的积累”,“专家”或“内行”。
在Java的世界里,Maven是指一个主流的项目管理工具。
在学习Maven之前,读者应对构建和依赖有些许概念,可参考前几篇博客。
# Maven能解决什么问题
在继续讲Maven是什么之前,我们先讲讲Maven出现之前,我们是怎么管理项目的,以此加深对Maven的理解。
我们知道,项目开发不仅仅是写写代码而已,期间会伴随着各种必不可少的事情要做:
- 开发时,我们需要引用各种 jar 包,尤其是比较大的工程,引用的 jar 包往往有几十个乃至上百个(JDBC,Junit,Log4j.......),每用到一个框架,都需要手动去官网下载,而每个依赖的官网往往各有特色,找个下载链接也要花一定的时间;下载后统一导入到工程,经常遇到各种的 jar 包冲突,版本冲突。
- 写好了 Java 文件,需要将它编译成二进制字节码。现在这项工作可以由各种集成开发工具完成,Eclipse、IDEA 等都可以将代码即时编译。比起用记事本来敲代码,然后用 javac 命令一个个地去编译,效率更高。而Maven也可以帮我们完成编译。
- 世界上没有不存在 bug 的代码,为了减少 bug,写完了代码,还要写一些单元测试,然后一个个的运行来检验代码质量。
- 再优雅的代码也是要打包的。我们后面还需要把代码与各种配置文件、资源整合到一起,定型打包,如果是 web 项目,还需要手工发布到服务器,重启。
试想,如果现在有一种工具,可以把你从上面的繁琐工作中解放出来,能帮你管理 jar 包,编译代码,还能帮你自动运行单元测试,打包,生成报表,甚至能部署项目,生成 Web 站点..... Maven 就可以解决上面所提到的这些问题。
接下来我们会简单介绍一下Maven的功能,为后续的实践打下理论基础。
# 依赖管理
在Maven中,每一个依赖都有一个坐标(Coordinate),我们是用坐标来定位依赖的。通过一个依赖的坐标,我们可以知道这个依赖属于哪个组织、使用的是什么模块,版本号是多少,然后Maven能通过坐标自动下载依赖。
听不懂?我们举几个生活的例子来说明什么是坐标:
- 在一个平面坐标系中,坐标(x,y)表示该平面上与x轴距离为y,与 y 轴距离为 x 的一点,任何一个坐标都能够唯一标识该平面中的一点
- 我们也可以将地址看成是一种坐标。省、市、区、街道等一系列信息同样可以唯一标识城市中的任一居住地址和工作地址。邮局和快递公司正是基于这样一种坐标进行日常工作的。
- 坐标还可以看成是一个依赖的“身份证”。例如人的身份证号组成是:地区号+生日日期+顺序码+校验码,通过身份证,能确定唯一的一个人,并且可以知道这个人的出生地区、出生日期和年龄等;
例如Junit的坐标长这样:
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
2
3
groupId、artifactId和version,这三个元素定义了一个基本的坐标:
- groupId:一般命名方式为组织名+项目名,这取决于发布该依赖的组织如何命名该项目。譬如在googlecode上建立了一个名为myapp的项目,那么groupId就应该是com.googlecode.myapp。显然,Apache组织命名Junit的时候就比较简单。
- artifactId:可以理解为模块名称。例如一个框架非常的大,分成了几个模块,用户可以根据模块名称来按需引入。
- version指定了该项目当前的版本。
更多关于坐标的东西,我们后面再详细展开。
# 仓库
之前我们说过Maven能通过坐标下载依赖,下载到哪里呢?仓库。仓库其实就是一个文件夹:
这个文件夹里面,根据不同的依赖分成了不同的文件夹,并且不同版本也是不同文件夹:
而Maven是从哪里下载依赖的呢?是一个叫做中央仓库的地方。中央仓库是Maven官方组织维护的一个仓库,里面收录了很多的依赖:
Maven在运行时,首先会从本地仓库寻找依赖,没有找到就会去中央仓库下载。中央仓库是在海外的,访问速度有点慢,因此国内不少机构(例如阿里云)也搞了一个仓库:
我们可以配置不从中央仓库下载依赖,而是从阿里云下载,这样下载速度能提高不少;这种仓库就叫远程仓库。实际上,中央仓库可以认为是一个特殊的远程库。
除此之外,在公司里我们可能不能联外网(为了安全),而是公司内部也搭建了一个仓库供开发人员使用,这样能提高安全性,还可以自己决定放什么依赖上去,下载速度也会更快(局域网),更灵活。有时候我们也叫这个为私服,私服也是远程仓库。
至此,我们可以给仓库分个类:
- 本地仓库
- 中央仓库
- 远程仓库(也叫私服)
使用仓库还有个好处:减少了重复的依赖。例如我们电脑上有10个项目,每个项目都用到了Junit,在Maven出现之前,每个项目的lib目录下都有Junit的依赖,相当于我们电脑上有10个重复的Junit。
而使用了Maven,所有依赖都在仓库里,项目需要用到的时候直接去仓库里面取就行了,项目本身是没有存放依赖的,这样节省了不少磁盘空间。
# 构建工具
我们之前说了什么是构建:构建、依赖管理 (opens new window)
而使用Maven,可以帮助我们一键构建,整个构建过程,使用 maven 一个命令可以轻松完成整个工作。Maven将构建分为了如下几步:
清理 → 编译 → 测试 → 报告 → 打包 → 部署
每一个步骤都有对应的Maven命令,也可以一键完成以上步骤,大大简化了构建的成本。
# 项目信息管理
一个项目中,除了代码之外,往往还有很多的其他的项目信息,例如项目的描述,开发者列表,Git仓库地址,许可证等等,这些都是比较琐碎麻烦的;另外还有一些测试报告,静态分析报告等有价值的项目信息,这些都可以通过Maven来管理,无形之间也省了不少麻烦。
# Maven的历史
说了这么多,咋们聊点简单的:Maven的历史以及学习的必要性
Maven诞生时间大概在2001年3月,在2007~2010年间,Maven开始流行起来。Maven之父后来创建了Sonatype公司,该公司目前仍在维护Maven。
Maven作者是Jason Van Zyl。
有必要学习Maven么?还是有一点必要的。原因如下:
- Maven使用率非常多,可以说是项目的标配,工作中经常用到。无论是小型的开源类库项目,还是大型的企业级应用;无论是传统的瀑布式开发,还是流行的敏捷模式,Maven都能大显身手
- 即使不是因为工作,自己开发项目起来,使用Maven也很简单;
- Maven解决了一些项目管理的痛点,我们在学习Maven时能体会到Maven是怎么解决这些痛点的;即使后续出现了新的工具,也能很容易上手;
- 本教程也就几篇博客,看完后能很快上手,花不了多少时间,后续想深入也可以阅读相关书籍。
# 小结
Maven的特点如下:
- 用于Java项目的构建、依赖管理和项目信息管理
- 跨平台,可以在Linux,Windows和Mac上使用,这得益于Maven自身也是用跨平台的Java语言实现的
- 是Apache组织开源的一个非常成功的项目,非常流行,可以说是开发Java项目的标配之一,Struts、Hibernate、Ehcache等知名的开源项目都使用Maven进行管理,国内外的公司Maven的使用率也很高。
- 适用于小型的开源项目 和大型企业级应用,功能非常强大
- 约定大于配置
本小结我们简单说了下Maven的作用:构建、依赖管理和项目信息管理,并简单介绍了下坐标的概念,后续我们一步步实践来初步掌握Maven