Apache Maven 2 简介
Apache Maven 2 简介
2011年04月02日
现代软件项目不再是单个本地团队独立开发的产物。随着健壮的企业级开源组件的可用性日益提高,当今的软件项目需要项目团队间的动态协作,往往也需要混合使用在全球范围内创建和维护的组件。如今,Apache Maven 构建系统步入了第二代,它和由 Internet 带来的全球软件开发时代之前所创建的那些遗留构建工具不同,它完全是重新设计的,以应对这些现代的挑战。本教程将带您从头领略 Maven 2。
开始之前
现代软件开发基于健壮的企业级开源技术,它需要一类新的构建工具和项目协作工具。Apache Maven 2 的核心引擎旨在简化往往十分复杂的大型协作性软件项目的构建和管理。在大型项目团队环境中工作是种挑战,而 Maven 2 以友好为设计目的,即便对那些不熟悉这种挑战的开发人员而言,Maven 2 也足够友好。本教程首先围绕单个的新手开发展开,然后逐渐介绍 Maven 2 中的一些协作性的概念和功能。我们鼓励您在本教程提供的介绍之上,探究本文范围之外的 Maven 2 的一些高级功能。
关于本教程
本教程将循序渐进地向您介绍有关 Maven 2 的基础概念和实践练习,具体内容包括: Maven 2 概览
理解 Maven 2 依赖项管理模型
Maven 2 存储库和 Maven 2 坐标
Maven 2 生命周期、阶段、插件和 mojo
下载和安装 Maven 2
实践 Maven 2 -- 您的第一个 Maven 2 项目
定制项目对象模型(POM)
参与多个项目
实践 Maven 2 -- 参与多个项目构建
在 Eclipse 3.2 中安装 Maven 2.x Plug-in
在 Eclipse 3.2 中使用 Maven 2.x Plug-in
读完本教程,您会理解并欣赏 Maven 2 背后的设计理念。也将进一步熟悉在使用 Maven 2 构建的项目中工作所需的基本技能。这是一张通往 Apache 和 Codehaus 社区中大多数大型项目的通行证。最为重要的是,您将可以把 Maven 2 应用到日常的项目构建和管理活动中。
先决条件 您应当大体上熟悉 Java?? 开发。本教程假设您理解构建工具的价值和基本操作,包括依赖项管理和输出打包。要求您能将 Eclipse 3.2 用作 IDE,从而在 Eclipse 中使用 Maven 2.x 插件。如果您熟悉大型开源项目(如 Apache 软件基金会管理下的项目),那就太好了。理解 Java 5 编码(包括泛型)会很有帮助。如果有各种项目构建技术的经验(如 Ant、autoconf、make 和 nmake)也很好,但不做强制性要求。 系统需求
为继续学习和试验本教程中的代码,您需要有效安装 Sun's JDK 1.5.0_09 (或其后的版本)或 IBM JDK 1.5.0 SR3。
针对教程中关于 Eclipse 的 Maven 2.x 的插件部分,需要有效安装 Eclipse 3.2.1 或其后版本。
本教程的推荐系统配置如下: 支持上述 JDK/JRE 的系统,有至少 1GB 的主存
有至少 20MB 的磁盘空间来安装软件组件和样例
本教程中的说明基于 Microsoft Windows 操作系统。教程中涵盖的所有工具也可以在 Linux?? 和 UNIX?? 系统上运行。
Maven 2 概览
Maven 是一个顶级的 Apache Software Foundation 开源项目,创建它最初是为了管理 Jakarta Turbine 项目复杂的构建过程。从那以后,不论是开源开发项目还是私有开发项目都选择 Maven 作为项目构建系统。Maven 快速地发展着,如今已是第二版,Maven 已经从针对单个复杂项目的定制构建工具成长为广泛使用的构建管理系统,其丰富的功能可以应用于大多数的软件开发场景。
概括来讲,Maven 2 能够: 理解项目通常是如何构建的。
利用其内嵌的项目知识简化和便利项目构建。
利用其内嵌的项目知识来帮助用户理解复杂的项目结构和构建过程中潜在的变数。
设计并实现一个经证实的依赖项管理系统,该系统顺应了当今全球化和相互联系的项目团队的需求。
利用其内部知识,针对简单项目提供简单的用户体验。
对于高级用户来说相当灵活;针对特别的应用场景,可以覆盖其内嵌模型,也可以通过配置、部署元数据或创建自定义插件对其内嵌模型进行改写。
全面扩展现有行为之外的场景细节。
捕获新出现的最佳实践和各个用户社区间的经确认的共同性,并将它们纳入到 Maven 的内嵌项目知识中,从而不断地得到改进。
Maven 2 -- 概念性的概览
为捕捉项目构建知识,Maven 2 依赖于一套发展中的有关事物如何运转的概念性模型。部分模型被硬编码为 Maven 代码库的一部分,这些模型通过新的 Maven 发布版本不断得到精炼。图 1 解释了 Maven 2 的关键模型: 图 1. Maven 2 对象和操作模型
图 1 中的关键组件为: 项目对象模型(POM): POM 是 Maven 2 中的里程碑式的模型。该模型的一部分已经构建到 Maven 引擎(被亲切地称为反应堆 )中,其余部分则通过一个名叫 pom.xml 的基于 XML 的元数据文件来声明。
依赖项管理模型: Maven 对如何管理项目的依赖项很在行。依赖项管理是一片灰色地带,典型的构建-管理工具和系统都未明确涉及。Maven 2 构建了 Maven 依赖项管理模型,该模型能够适应大多数需求。这个模型被证明是有效而高产的模型,目前,主要的开源项目都部署了该模型。
构建生命周期和阶段:和 POM 相关的概念是构建生命周期 和阶段。这是 Maven 2 的内嵌概念模型和现实物理世界之间的接口。使用 Maven 时,工作主要是通过插件来执行的。在构建周期中,Maven 2 通过遵循一系列定义好的阶段,将这些插件协调起来。
如果您对其中一些概念还有点模糊,请不要担心。接下来的部分会用具体的例子来巩固这些模型背后的概念。
Maven 2 -- 物理概览
图 2 揭示了 Maven 2 的操作方式和与之交互的方式,同时显示了它的物理构成。图 2 提供了有关如何与 Maven 进行交互的概览: 图 2. Maven 2 操作和交互模型
图 2 中,POM 是 Maven 对您的特定项目的理解。这个模型由包含在一系列 pom.xml 文件中的声明性描述构成。这些 pom.xml 文件构成一棵树,每个文件能从其父文件中继承属性。Maven 2 提供一个 Super POM。这个 Super POM 位于层级树的顶端,它包含所有项目的默认通用属性;每个项目的 POM 都从这个 Super POM 处继承。 依赖项被指定为 pom.xml 文件的一部分。Maven 根据其依赖项管理模型解析项目依赖项。Maven 2 在本地存储库和全球存储库寻找依赖性组件(在 Maven 术语里称作工件 )。在远程存储库中解析的工件被下载到本地存储库中,以便使接下来的访问可以有效进行。Maven 2 中的这个依赖项解析器可以处理可递 依赖项。即,它能有效地解析您的依赖项所依赖的那些依赖项。 Maven 引擎通过插件 亲自执行几乎所有的文件处理任务。插件被配置和描述在 pom.xml 文件中。依赖项管理系统将插件当作工件来处理,并根据构建任务的需要来下载插件。每个插件都能和生命周期中的不同阶段联系起来。Maven 引擎有一个状态机,它运行在生命周期的各个阶段,在必要的时候调用插件。 理解 Maven 2 依赖项管理模型
在有效利用 Maven 2 之前,您需要理解 Maven 2 依赖项管理模型是如何运行的。 依赖项开发适应于这样的项目,其软件组件(称作模块 )是由不同的项目团队开发的。它支持持续独立开发,也支持对所有依赖模块进行精炼。 这个团队协作场景在通过 Internet 建立和维护的开源项目中十分常见,由于内部开发大受开源或外包世界的冲击和影响,这种场景在合作开发的圈子里日益盛行。
解析项目依赖项
Maven 2 依赖项管理引擎帮助解析构建过程中的项目依赖项。 Maven 本地存储库和远程存储库
Maven 2 本地存储库是磁盘上的一个目录,通常位于 HomeDirectory/.m2/repository。这个库扮演着高性能本地缓存的角色,存储着在依赖项解析过程中下载的工件。远程存储库要通过网络访问。可以在 settings.xml 配置文件中维护一个远程存储库列表以备使用。 实