简介
Maven,在意第绪语中意为对知识的积累。Maven最初用来在Jakarta Turbine项目中简化该项目的构建过程。Jakarta Trubine项目有多个工程,每个工程都有自己的多个Ant构建文件。每个工程的这些构建文件都只有一小部分不同,并且所有的Jar文件被使用CVS纳入了版本管理。我们想要实现一种标准方式去构建这些工程、明确定义这些工程的组成部分、简单的发布工程信息以及多个工程间共享Jar包。
就这样,一个能够构建和管理任何基于java的工程的工具诞生了。我们希望我们做的这些事情能够简化Java开发者日复一日的工作,并有助于他们对任何基于Java的项目的理解。
Maven的目标
Maven的主要目标是希望开发者能在最短的时间内理解开发的完整状态。为了达到这个目标,Maven在以下几个方面做出了努力:
- 简化构建过程
- 统一构建体系
- 提供高质量的项目信息
- 提供开发的最佳实践指南
- 实现透明的向新特性的迁移
简化构建过程
使用Maven不需要知道一些潜在的或底层的机制,Maven屏蔽了很多细节。
统一构建体系
Maven通过使用工程对象模型(project object model POM)以及一系列可共享的插件来构建工程。只要你熟悉了怎么构建一个Maven工程,你就自然知道了怎么构建所有的Maven工程。这种统一的构建体系可以节省大量的了解工程结构的时间。
提供高质量的项目信息
Maven提供了很多有用的工程信息,这些信息一部分来自于工程的POM文件,一部分来自原工程源码。Maven可以提供以下信息:
- 从源码控制处生成的修改日志文档
- 交叉引用源码
- 开发者邮件列表
- 项目依赖列表
- 包含覆盖率的单元测试报告
Maven改进了工程信息的提供,所有这些信息对Maven用户来说都是透明的。
Maven还允许其他人提供Maven插件来获取工程信息,与Maven获取的标准信息同样处理。这些都需要基于POM来完成。
提供开发的最佳实践指南
Maven致力于收集现有的开发的最佳实践原则,并以此来简化工程的开发。
例如:规范,执行,和单元测试报告是正常使用Maven构建周期的一部分。目前Maven中的单元测试最佳实践如下:
- 将测试源码放在一个单独的,但与主代码同级的位置
- 使用测试用例命名规范来定位和执行测试
- 让测试用例本身去设置测试环境,不要为了测试而专门构建环境
Maven 在工程的目录结构上也给出了许多最佳实践指南。遵守了这些工程目录结构指南后,如果你了解了这种目录结构,你也就会容易的了解其他所有遵循了这种目录结构的Maven工程。
实现透明的向新特性的迁移
Maven为使用者提供了一种简单的方式去更新他们已经install的工程,这使得用户可以获取到基于Maven对工程作出的任何变化。
基于以上原因,install新的工程、从第三方或Maven本身更新插件变得非常容易和常见。
Maven不是什么?
你或许听说过以下关于maven的描述:
- Maven是一个网站和文档工具
- Maven继承于Ant,可以让你下载工程依赖
- Maven是一系列可复用的Ant脚本的集合
Maven确实做了以上这些事情,这可以从“Maven是什么”一节中看到。但这些不是Maven仅有的特性,mavan的目标不止于此。
Maven确实鼓励最佳实践,但由于一些历史原因,我们对一些工程的实现可能没有遵循这些最佳实践。虽然Maven被设计为有弹性的,在一定程度上,为了满足不同工程的需要,为了达到所有的目标,我们做出了一些妥协,以使Maven能满足每一种情况。
如果你决定了使用Maven,但是你的工程目录结构与Maven推荐的不一样而你无法重新组织,你可能需要放弃一些Maven特性,不能完全的使用Maven了。
原文来自于Maven官网:What is Maven?