Maven 的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)。开发人员只需做一些简单的配置,就可以批量完成项目的构建、报告和文档的生成工作。
Maven 是跨平台的,这意味着无论是在 Windows 上,还是在 Linux 或者 Mac 上,都可以使用同样的命令。
我们一直在不停地寻找避免重复的方法。设计的重复、编码的重复、文档的重复,当然还有构建的重复。Maven 最大化地消除了构建的重复,抽象了构建生命周期,并且为绝大部分的构建任务提供了已实现的插件,我们不再需要定义过程,甚至不需要再去实现这些过程中的一些任务。
最简单的例子是测试,我们没必要告诉 Maven 去测试,更不需要告诉 Maven 如何运行测试,只需要遵循 Maven 的约定编写好测试用例,当我们运行构建的时候,这些测试便会自动运行。
想象一下,Maven 抽象了一个完整的构建生命周期模型,这个模型吸取了大量其他的构建脚本和构建工具的优点,总结了大量项目的实际需求。如果遵循这个模型,可以避免很多不必要的错误,可以直接使用大量成熟的 Maven 插件来完成我们的任务(很多时候我们可能都不知道自己在使用 Maven 插件)。此外,如果有非常特殊的需求,我们也可以轻松实现自己的插件。
Maven 还有一个优点,它能帮助我们标准化构建过程。在 Maven 之前,十个项目可能有十种构建方式。有了 Maven 之后,所有项目的构建命令都是标准化。
综上所述,Maven 作为一个构建工具,不仅能帮我们自动化构建,还能够抽象构建过程,提供构建任务实现;它跨平台,对外提供了一致的操作接口,这一切足以使它成为优秀的、流行的构建工具。
当然,Maven 除了是一个优秀的项目构建方面的管理工具外,还有项目管理相关的其他特殊优势。比如,项目相关的第三方依赖包,这是每个 Java 程序员不可回避的问题。
每个老程序员都在自己的计算机里有个专门目录,分类保存过去项目开发过程中使用的第三方 jar 包,需要的时候从里面筛选。新程序员就麻烦了,测试项目的时候,经常会遇到 Class No Found Exception,导致一整天在搜索和重启中度过。
Maven 可以统一管理所有的依赖 jar,甚至是不同的版本。程序员也可以动态地将自己写好的模块打包成 jar 包让它管理。需要的时候,可以直接通过简单的描述文件告诉 Maven,它会自动帮助程序员找出来,集成到项目中。并且它提供了中央仓库,能帮我们自动下载构件。
在这个开源的年代里,几乎任何 Java 应用都会借用一些第三方的开源类库,这些类库都可通过依赖的方式引入到项目中来。
随着依赖的增多,版本不一致、版本冲突、依赖臃肿等问题都会接踵而来。手工解决这些问题是十分枯燥的,幸运的是 Maven 提供了一个优秀的解决方案,它通过一个坐标系统准确地定位每一个构件(artifact),也就是通过一组坐标 Maven 能够找到任何一个 Java 类库(如 jar 文件)。
Maven 给这个类库世界引入了经纬,让它们变得有秩序,于是我们可以借助它来有序地管理依赖,轻松地解决那些繁杂的依赖问题。
Maven 还能帮助我们管理原本分散在项目中各个角落的项目信息,包括项目描述、开发者列表、版本控制系统地址、许可证、缺陷管理系统地址等。这些微小的变化看起来很琐碎,并不起眼,但却在不知不觉中为我们节省了大量寻找信息的时间。
除了直接的项目信息,通过 Maven 自动生成的站点,以及一些已有的插件,我们还能够轻松获得项目文档、测试报告、静态分析报告、源码版本日志报告等非常具有价值的项目信息。
Maven 还为全世界的 Java 开发者提供了一个免费的中央仓库,在其中几乎可以找到任何的流行开源类库。通过一些 Maven 的衍生工具(如 Nexus),我们还能对其进行快速地搜索。只要定位了坐标,Maven 就能够帮我们自动下载,省去了手工劳动。
使用 Maven 还能享受一个额外的好处,即 Maven 对于项目目录结构、测试用例命名方式等内容都有既定的规则,只要遵循了这些成熟的规则,用户在项目间切换的时候就免去了额外的学习成本,可以说是约定优于配置(Convention Over Configuration)。
总结一下,Maven 的作用如下:
- Maven 统一集中管理好所有的依赖包,不需要程序员再去寻找。
- 对应第三方组件用到的共同 jar,Maven 自动解决重复和冲突问题。
- Maven 作为一个开放的架构,提供了公共接口,方便同第三方插件集成。程序员可以将自己需要的插件,动态地集成到 Maven,从而扩展新的管理功能。
- Maven 可以统一每个项目的构建过程,实现不同项目的兼容性管理。
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/22628.html