原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/flyingweb/p/8478044.html
第一章:Maven简介
一、何为Maven?
Maven这个词可以翻译为“知识的积累”,本书将介绍Maven这一跨平台的项目管理工具。作为Apache组织中的一个颇为成功的开源项目,Maven主要服务于基于Java平台的项目构建、依赖管理和项目信息管理。
(一)Maven是优秀的——项目构建工具
要理解何为Maven,首先得理解何为构建。构建是我们每一位程序员每天都在做的工作,除了编写代码,我们每天有相当一部分时间花在了清理、编译、测试、生成文档、打包和项目部署等繁琐的工作上,这就是构建(build)。
Maven是一个异常强大的构建工具,能够帮助我们自动化构建过程,从清理、编译、测试到生成报告,再到打包和部署。我们不需要也不应该一遍遍地输入指令和点击鼠标,我们要做的是使用Maven配置好项目,然后输入简单的命令(如man clean install),Maven会帮我们处理那些繁琐的任务。
Maven抽象了一个完整的构建生命周期模型,并且为绝大部分的构建任务提供了已实现的插件。只要遵循这个模型,就可以避免很多不必要的错误,可以直接使用大量成熟的Maven插件来完成我们的任务。此外,如果有非常特殊的需求,我们亦可以轻松实现自己的插件。
Maven作为构建工具,不仅能帮助我们自动化构建,还能够抽象构建过程,提供构建任务实现;它跨平台,对外提供一致的操作接口(标准化构建过程),这一切足以使它成为优秀的、流行的构建工具。
(二)Maven是出色的——项目依赖管理工具
在这个开源的年代里,几乎任何Java应用都会借用一些第三方的开源类库,这些类库都可以通过依赖的方式引入到项目中来。随着依赖的增多,版本的不一致、版本冲突、依赖臃肿等问题都会接踵而来。手工解决这些问题变得十分枯燥,幸运的是Maven提供了一个优秀的解决方案,它通过一个坐标系统准确的定位每一个构件(artifact),也就是通过一组坐标Maven能够找到任何一个Java类库。Maven给这个类库世界引入经纬,让它们变得有秩序。
Maven还为全世界的Java开发者提供了一个免费的中央仓库,在其中几乎可以找到任何的流行开源类库。通过一些Maven的衍生工具(如Nexus),我们还能对其进行快速的搜索,只要定位了坐标,Maven就能够帮我们自动下载,省去手工的麻烦。
(三)Maven还是——项目信息管理工具
Maven还能够帮助我们管理那些原本分散在项目中各个角落的项目信息,包括项目描述、开发者列表、版本控制系统地址、许可证、缺陷管理系统地址等。为我们节省了大量寻找信息的时间。
除了直接的项目信息,通过Maven自动生成的站点,以及已有的一些插件,我们可以轻松的获取项目文档、测试报告、静态分析报告、源码版本日志报告等非常具有价值的项目信息。
另外,使用Maven还有一个额外的好处,Maven对项目的目录结构、测试用例命名方式等内容都有既有的约定规则,只要遵循了这些成熟的规则,用户在项目间切换的时候就免去了额外的学习成本,可以说是约定优于配置(Convention Over Configuration)。
二、为什么需要Maven
Maven不是Java领域唯一的构建管理解决方案。本节将通过一些简单的例子解释Maven的必要性,并介绍其他的构建解决方案,如IDE、Make和Ant,并将它们与Maven进行比较。
(一)为什么不是自定义构建系统
使用脚本建立高度自定义的构建系统(重复发明轮子),耗时费力,结果也不一定很好。当然,你可以享受从无到有的乐趣,但恐怕实际项目中无法给你那么多的时间。使用Maven省时省力,并能够得到成熟的构建系统,还能得到来自于Maven社区的大量支持。Maven是开源的,你无须为此付费。如果你有兴趣,你还能去了解Maven是如何工作的。
(二)为什么不是IDE
使用简单的文本编辑器和命令行也能够完成绝大部分的开发工作,但很少有人愿意一直这样做。
虽然,我们无法否认优秀的IDE能够大大的提高开发效率。主流的IDE(如eclipse)都提供了强大的文本编辑、调试甚至重构功能。但是,IDE是有天生缺陷的(IDE不是万能的):
- IDE依赖大量的手工操作。编译、测试、代码生成等工作都是相互独立的,很难一键完成所有工作。
- 很难在项目中统一所有的IDE配置,每个人都有自己的喜好。也正是由于这个原因,一个在机器A的IDE上可以运行的任务,到了机器B的IDE中可能就会失败。
我们应该合理的利用IDE,而不是过多的依赖它。对于构建这样的任务,在IDE中一次次地点击鼠标是愚蠢的行为。Maven是这方面的专家,而且主流的IDE都集成了Maven,我们可以在IDE中方便地运行Maven执行构建。
(三)为什么不是Make
Make也许是最早的构建工具,它是由Stuart Feldman于1977年在Bell实验室创建。目前Make有很多衍生实现,包括最流行的GUN Make 和BSD Make,还有Windows平台的Microsoft nmake等。
Make由一个名为Makefile的脚本文件驱动,该文件使用Make自己定义的语法格式。Make通过一系列的目标(Target)和依赖(Prerequisite)将整个构建过程串联起来,同时利用本地命令(Command)完成每个目标的实际行为。Make的强大之处在于它利用所有系统的本地命令,尤其是UNIX/Linux系统,丰富的功能、强大的命令能够帮助Make快速高效地完成任务。
但是,Make将自己和操作系统绑定在一起。也就是说,使用Make很难实现跨平台的构建,这对于Java来说是非常的不友好的。此外,Makefile的语法也成问题,很多人抱怨Make构建失败的原因往往是一个很难发现的空格或者Tab使用错误。
(三)为什么不是Ant
Ant意指“另一个简洁的工具”(Another Neat Tool),它最早用来构建著名的Tomcat,其作者James Duncan Davidson创建它的动机就是因为受不了Makefile的语法格式。我们可以将Ant看成是一个Java版本的Make,也正因为使用了Java,Ant是跨平台的。此外,Ant使用XML定义构建脚本,相对于Makefile来说,这也更加友好。Ant有大量内置的用Java实现的任务,这保证了其跨平台的特质,同时,Ant也有特殊的任务exec来执行本地命令。
和Make一样,Ant也都是过程式的,开发者显式地指定每一个目标,以及完成该目标所需要执行的任务,针对每一个项目,开发者都需要重新编写这一过程,这里其实隐含着很大的重复(重复发明轮子)。Maven是声明式的,项目构建过程和过程各个阶段所需的工作都由插件实现,并且大部分插件都是现成的,开发者只需声明项目的基本元素,Maven就指定内置的、完整的构建过程,这在很大程度上消除了重复。
Ant是没有依赖管理的,所以很长一段时间Ant用户都不得不手工管理依赖,这是一个令人头疼的问题。幸运的是,Ant用户现在可以借助Ivy管理依赖。对于Maven来说,依赖管理是理所当然的,Maven不仅内置了依赖管理,更有一个可能拥有全世界最多Java开源软件包的中央仓库,Maven用户无须进行任何配置就可以直接享用。
(四)不要重复发明轮子
不要重复发明轮子,Maven已经有一大把现成的插件,全世界都在用,你自己不用写任何代码!为什么没有人说“我自己写的代码最灵活,所以我不用Spring,我自己实现IoC;我不用Hibernate,我自己封装JDBC”?
【END】