|
![]() | 级别: 初级 Paul Duvall, CTO, Stelligent Incorporated 2008 年 6 月 10 日 管理项目和工具之间的源代码依赖项往往非常困难,但并不一定总是如此。在这一期“ 让开发自动化 ”中,自动化专家 Parl Duvall 介绍了如何利用 Apache Ant 项目中的 Ivy 依赖项管理器来处理所有重要 Java 项目必须管理的无数依赖项。 实际上,所有软件开发项目都必须依靠来自其他项目的源代码。例如,许多项目可能依靠 log4j 等日志记录工具和 Struts 之类的 Web 框架。您的开发团队不会维护其他项目的源代码,但要依靠其 API 来实现项目中的定制软件。您的软件所依靠的其他项目数量越多(包括这些项目自身的依赖项),构建软件就变得越复杂。
我已经看到许多团队使用各种不完善的技术,尝试解决这种难题:
我参加过一个中型项目,包含 1,000 个 Java 类和 100 多个有依赖关系的 JAR 文件。(我们选择了第一种不完美的技术:将所有 JAR 签入项目的版本控制存储库。)图 1 显示了可能在此类项目中看到的一小部分依赖项的类型: ![]()
图 1 表现出,Brewery 项目的源代码依赖于 Hibernate、Struts 2、MySQL Connector 和 Cobertura。而 Cobertura 又依赖其他 JAR,如 asm-2.2.1.jar、jakarta-oro-2.0.8.jar 和 log4j-1.2.9.jar。此外,asm-2.2.1.jar 依赖 asm-tree-2.2.1.jar。这仅仅是可能出现的各类嵌套依赖项的一个简单示例。即便是某个 JAR 的版本不正确,您也会体验到难以排除的问题,例如编译错误或意料之外的行为。 Apache Maven 构建管理和项目管理工具已经吸引了 Java 开发人员的注意。Maven 引入了 JAR 文件公共存储库的概念,可通过公开的 Web 服务器访问(称为 ibiblio)。Maven 的方法减少了 JAR 文件膨胀的情况,不会占用大多数版本控制存储库。但使用 Maven 时,它会鼓励您采用其 “惯例优于配置” 的方法来构建软件,这会制约您定制构建脚本的灵活性。 如果您多年来一直使用 Apache Ant,现在希望获得使用公共存储库的优势,又该如呢?您是否不得不接受 Maven 的构建方法来获得这些收益?幸运的是,答案是否定的,这是由于一种称为 Apache Ivy 的工具 — Ant 的一个子项目。Ivy 提供了最一致、可重复、易于维护的方法,来管理项目的所有构建依赖项(在 参考资料 部分中可以找到 Maven 和 Ivy 的比较)。这篇文章介绍了安装和配置 Ivy 来管理依赖项的基础知识,指出了可参考的更多信息。 开始使用 Ivy 非常简单,只需创建两个 Ivy 特有的文件,添加一些 Ant 目标即可。Ivy 特有的文件是 ivy.xml 和一个 Ivy 设置文件。ivy.xml 文件中列举了项目的所有依赖项。ivysettings.xml 文件(可以随意为此文件命名)用于配置从中下载有依赖关系的 JAR 文件的存储库。 清单 1 展示了一个简单的 Ant 脚本,它调用了两个 Ivy 任务:
在 清单 1 中, 下载并使用 Ivy 的方法有几种。第一种是手动将 Ivy JAR 文件下载到 Ant lib 目录中,也可下载到 Ant 脚本的类路径中定义的某个目录中。我迷上了自动化,所以更倾向于使用自动化替代方案:下载 Ivy 的 JAR 文件,在 Ant 目标中配置类路径。清单 2 展示了这种技术的示例: 清单 2 中的第二行定义了 XML 名称空间。 一旦下载并配置了 Ivy,就可以使用任意 Ivy Ant 任务(如 清单 1 中调用的两个任务)。 ivy.xml 文件是必不可少的,您在此文件中定义项目的全部有依赖关系的 JAR。清单 3 展示了一个示例:
请注意,清单 3 未表示任何文件位置或 URL,允许您转到其他目录位置,而无需更改依赖项列表。 清单 4 是 Ivy 设置文件的示例。它定义了 清单 3 中 ivy.xml 文件所用的存储库位置和相关模式。 清单 4 中的
一个模块常常要依赖其他模块。例如,在 图 1 中可以看到,cobertura-1.9.jar 文件的多个依赖项中包括 asm-2.2.1.jar,而 asm-2.2.1.jar 又依赖于 asm-tree-2.2.1.jar。如果没有像 Ivy 这样的工具,您就需要确保类路径中存在这些 JAR 的正确版本,保证 JAR 版本之间不存在冲突。而使用 Ivy,您只需定义
清单 5 中特别强调的依赖项定义了 图 2 展示了符合 清单 4 所示 ivysettings.xml 文件配置的存储库中的目录结构: ![]() 请注意,图 2 展示了一个 ivy.xml 文件(见清单 6),它定义了
简单说明一下, 请注意,图 3 中的 ![]() 当然,差别在于 JAR 文件包含不同的类,图 2 所示的 ivy.xml 文件的定义描述了
既然您已经掌握了使用 Ivy 的基本知识,下面我将介绍其他一些有用的 Ant 任务。 Ivy 提供了一个任务,用于报告一个项目中的依赖文件。清单 7 展示了如何调用 Ivy 的
清单 7 中的脚本生成了一份 HTML 报告,显示了某项目的依赖文件列表。图 4 展示了该报告: ![]() 还有其他许多针对 Ivy 的 Ant 任务可供您使用 — 通过为 Maven 生成一个 POM 文件来清理本地文件系统缓存。表 1 显示了部分 Ivy 的 Ant 任务及其用途:
参见 参考资料,了解 Ivy 中可用的其他 Ant 任务。
Ivy 集中管理依赖文件,消除了开发团队将 JAR 文件从一个版本控制存储库复制到另一个存储库中时可能出现的膨胀现象。如果您正参与一个简单的项目,将 JAR 文件签入版本控制系统或使用本文开头列出的其他某些技术可能不会显著降低您的速度。但若您的项目规模越来越大,或者您在使用公共文件的企业环境中工作,一种公共方法就变得十分必要。无论是哪种情况,Ivy 都能使定义项目依赖项更为一致、更为可行。因此值得您付出时间研究 Ivy 在您的项目中的应用。 学习
获得产品和技术 讨论
|