1:何为Maven
Maven:中文翻译为“知识的积累”,也可翻译为“专家”或“内行”。
谈到Maven,就不得不提“构建(build)”,那么什么是构建呢,我们每天在对代码进行编译、运行单元测试、生成文档、打包、部署等繁琐但是能够使代码得以最大的健壮和最小的bug的保证,这即使构建,其实说白了,就是让代码运行起来的过程。但是每天这样人工的操作,着实是有些浪费时间呀,Maven就是一款起那个大的构建工具,能够帮助我们自动化构建过程,从清理、编译、测试到生成报告、再到打包和部署。我们就可以省下一遍又一遍地输入命令,一遍又一遍地点击鼠标的时间。我们要做的就是使用Maven配置好项目,然后输入简单的命令(如:mvn clean install),Maven就会自动帮我们处理那些繁琐的任务。
我们一直在不停地寻找避免重复的方法。设计的重复、编码的重复、文档的重复、当然还有构建的重复。Maven能够最大化地消除构建的重复,抽象了构建生命周期,并且为绝大部分的构建任务提供了已实现的插件,我们不需要定义过程,甚至不需要再去实现这些过程中的一些任务。最简单的例子就是测试了,我们没必要告诉Maven去测试,更不需要告诉Maven如何运行测试,只需要遵循Maven的约定编写好测试用例,当我们运行构建的时候,这些测试便会自动执行,这应该就是传说中的测试驱动开发吧(TDD:Test Driver Development)。
Maven的另一个优点:标准化构建过程。在Maven之前,是个项目可能有十种构建方式,但是有了Maven之后,所有的项目的构建命令都是简单一致的。这极大地避免了不必要地学习成本,而且有利于促进项目团队的标准化。
正如Java并不仅是一门编程语言,还是一个平台一样。Maven不仅是一个构建工具,还是一个依赖管理工具和项目信息管理工具。它提供了中央仓库,能帮我们自动下载构件。开源年代的出现,就意味着类库的增多,类库版本的高速增长,面对这些不同版本的依赖,靠手工的方式去解决依赖冲突,版本不一致的问题是非常痛苦和浪费了不必要的时间。而Maven提供了一个优秀的解决方案,它通过月hi个坐标系统准确地定位每一个构件(artifact),也就是通过一组坐标Maven能够找到任何一个Java类库(如Jar文件)。Maven给这个类库世界引入了经纬,让他们变得有序,于是我们可以借助它;来有序地管理依赖,轻松地解决那些繁杂的依赖问题。
使用Maven还能享受一个额外的好处,即Maven对于项目目录结构、测试用例命名方式等内容都有既定的规则,只要遵循了这些成熟的规则,用户在项目间切换的时候就免去了额外的学习成本,可以说是约定优先于配置(Convention Over Configuration)
综上所述,Maven作为一个构建工具,不仅能够帮我们自动化构建,还能抽象构建过程,提供构建任务实现,并且跨平台,对外提供一致的操作接口,这一切足以使它称为优秀的,流行的构建工具。
2:为什么需要Maven
Maven不是Java领域唯一的构建管理解决方案。例如IDE,Make,Ant同样是构建管理的解决方案。
使用Maven的好处
- 省时省力,能够得到成熟的构建系统
- 统一的坐标管理
IDE
- IDE依赖大量的手工操作。编译、测试、代码生成等工作都是相互独立的,很难一键完成所有的工作,手工往往意味着低效,意味着容易出错。
- 很难在项目中统一所有的IDE配置,每个人都有自己的喜好。也正是由于这个原因,一个在机器A上可以成功运行的任务,到了机器B上可能就会失败。
Make
最早的构建工具,由Stuart Feldman于1977年在Bell实验室创建
- Make的强大之处在于它可以利用所有系统的本地命令,尤其是Unix /Linux系统,丰富的功能、强大的命令能够帮助Make快速高效地完成任务。
- Make与操作系统的绑定是一大弊端,使用Make,就不能实现(至少很难)跨平台地构建,这对Java来说是不友好的。
- Makefile的语法往往会因一个难以发现的空格或Tab使用错误导致构建失败
Ant
Ant不是蚂蚁,而是”另一个整洁的工具”(Another Neat Tool),最早用来构建Tomcat,作者James Duncan Davidson就是因为受不了Makefile的
语法格式而创建的。
Maven
拒绝重复的劳动,拒绝一样的轮子。
3:Maven与极限编程
极限编程(XP)是一种敏捷开发方法,强调拥抱变化。
Maven在极限编程中的应用
- 简单
Maven暴露了一组一致、简洁的操作接口,能帮助团队成员从原来的高度自定义的、复杂的构建系统中解脱出来,使用Maven现有的成熟的、稳定的组件
也能简单构建系统的复杂度
- 交流与反馈
与版本控制系统结合后,所有人都能执行最新的构建并快速得到反馈。此外,自动生成的项目报告也能帮助成员了解项目的状态,促进团队的交流。
- 测试驱动开发(TDD)
TDD强调测试先行,所有产品都应该由测试用例覆盖。而测试是Maven声明周期的最重要的组成部分之一,并且Maven有现成的成熟插件支持业界流行的测
试框架,如Junit和TestNG
- 十分钟构建
十分钟构建强调我们能够随时快速地从源码构建出最终的产品。这正是Maven所擅长的,只需要一些配置,之后用一条简单的命令就能让Maven帮你
清理、编译、测试、打包、部署、然后得到最终产品。
- 持续集成(CI)
CI强调项目以很短的周期(如15分钟)集成最新的代码。实际上,CI的前提是源码管理系统和构建系统。目前业界流行的CI服务器如Hudson
和CruiseControl都能很好的和Maven进行集成。也就是说,使用Maven后,持续集成会变地更加方便。
- 富有信息的工作区
这条实践强调开发者能够快速方便地了解到项目的最新状态。当然,Maven并不会帮你把测试覆盖率报告贴到墙上,也不会在你的工作台上放个东西告诉你
构建失败了,不过Maven发布的项目报告站点,并配置你需要的项目报告,如测试覆盖率报告,都能帮你把信息推送到开发者眼前。
4:被误解的Maven
任何事务都是存在两面性的,采用辩证的角度看就好了,你喜欢自然不会误解,你不喜欢,再误解我也无法改变,在这上面大家就各抒己见好了。
5:小结
Maven对于我来说是一种非常优秀的构建工具,它的出现,解决了之前困扰我很久的包版本不一致,版本冲突的问题,其坐标的定位方法,和提供相关依赖
的下载,为程序员更加的关注与业务,而不是这种能够避免的错误上。其和IDE的集成,更是极大的方便了软件项目的开发,提升了开发效率。