常见网站开发技术之二:利用 Ivy 管理依赖项
2009-08-12 13:37
771 查看
|
![]() | 级别: 初级 Paul Duvall, CTO, Stelligent Incorporated 2008 年 6 月 10 日 管理项目和工具之间的源代码依赖项往往非常困难,但并不一定总是如此。在这一期“ 让开发自动化 ”中,自动化专家 Parl Duvall 介绍了如何利用 Apache Ant 项目中的 Ivy 依赖项管理器来处理所有重要 Java 项目必须管理的无数依赖项。 实际上,所有软件开发项目都必须依靠来自其他项目的源代码。例如,许多项目可能依靠 log4j 等日志记录工具和 Struts 之类的 Web 框架。您的开发团队不会维护其他项目的源代码,但要依靠其 API 来实现项目中的定制软件。您的软件所依靠的其他项目数量越多(包括这些项目自身的依赖项),构建软件就变得越复杂。
将全部有依赖关系的项目(JAR 文件)放在一个目录中,此目录将签入项目的版本控制存储库。这种技术不必要地增加了存储库的大小,使得管理版本差异极为困难。 将有依赖关系的 JAR 分配到一个公共文件服务器上,使团队无法控制版本更改。 手动将 JAR 文件复制到各开发人员工作站上的指定位置。这种方法使得确定丢失的文件或修正版本极为困难。 执行一条 HTTP Get命令,将文件下载到开发人员的工作站,手动执行或将其作为自动构建的一部分。这种技术会造成未受管理的 JAR 文件。 我参加过一个中型项目,包含 1,000 个 Java 类和 100 多个有依赖关系的 JAR 文件。(我们选择了第一种不完美的技术:将所有 JAR 签入项目的版本控制存储库。)图 1 显示了可能在此类项目中看到的一小部分依赖项的类型: ![]()
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 任务: ivy:settings和 ivy:retrieve。
ivy:settings定义了 Ivy 设置文件。对 ivy:retrieve的调用从 ivy.xml 声明的一个存储库中检索 JAR 文件。 下载并使用 Ivy 的方法有几种。第一种是手动将 Ivy JAR 文件下载到 Ant lib 目录中,也可下载到 Ant 脚本的类路径中定义的某个目录中。我迷上了自动化,所以更倾向于使用自动化替代方案:下载 Ivy 的 JAR 文件,在 Ant 目标中配置类路径。清单 2 展示了这种技术的示例: <?xml version="1.0" encoding="iso-8859-1"?> <project name="test-ivy" default="init-ivy" basedir="." xmlns:ivy="antlib:org.apache.ivy.ant" xmlns="antlib:org.apache.tools.ant"> <property name="ivy.install.version" value="2.0.0-beta2" /> <property name="ivy.home" value="${user.home}/.ant" /> <property name="ivy.jar.dir" value="${ivy.home}/lib" /> <property name="ivy.jar.file" value="${ivy.jar.dir}/ivy.jar" /> <taskdef resource="org/apache/ivy/ant/antlib.xml" uri="antlib:org.apache.ivy.ant" classpath="${ivy.jar.dir}/ivy.jar"/> <target name="download-ivy"> <mkdir dir="${ivy.jar.dir}"/> <get src="http://www.integratebutton.com/repo/ ${ivy.install.version}/ivy-2.0.0-beta2.jar" mce_src="http://www.integratebutton.com/repo/ ${ivy.install.version}/ivy-2.0.0-beta2.jar" dest="${ivy.jar.file}" usetimestamp="true"/> </target> </project> antlib在 ivy.jar 文件中引用 antlib.xml。其余的 xmlns指明了 ivyAnt 任务的完全限定路径。 ${user.home}/.ant的 ivy.home值是 ivy.jar 文件下载的目标位置。 taskdef定义了 ivyAnt 任务,引用其类路径的位置。 download-ivy目标下载 ivy-2.0.0-beta2.jar 并使用 dest属性为其重命名。 一旦下载并配置了 Ivy,就可以使用任意 Ivy Ant 任务(如 清单 1 中调用的两个任务)。 ivy.xml 文件是必不可少的,您在此文件中定义项目的全部有依赖关系的 JAR。清单 3 展示了一个示例:
info元素中的 organisation属性标识了组织类型(如 .net、.org 或 .com)。后接 module名称。此模块的依赖项列表遵循一种命名规范,在下一个清单中您将更清晰地看出此规范。目前,只需记住 dependency name="cobertura" rev="1.9"将转换为 cobertura-1.9.jar 即可。 清单 4 是 Ivy 设置文件的示例。它定义了 清单 3 中 ivy.xml 文件所用的存储库位置和相关模式。 filesystem元素定义了本地工作站上的位置模式。两个 url元素定义了可用于下载 JAR 文件的多个位置:第一个元素定义了受我控制的 integratebutton.com 上的一个自定义存储库;第二个元素定义了包含大量开源 JAR 文件的外部 Maven 存储库(不受我控制)。如果 Ivy 无 <ivysettings> <settings defaultResolver="chained"/> <resolvers> <chain name="chained" returnFirst="true"> <filesystem name="libraries"> <artifact pattern="${ivy.conf.dir}/repository/[artifact]-[revision].[type]" /> </filesystem> <url name="integratebutton"> <artifact pattern="http://www.integratebutton.com/repo/[organisation]/[module]/ [revision]/[artifact]-[revision].[ext]" /> </url> <ibiblio name="ibiblio" /> <url name="ibiblio-mirror"> <artifact pattern="http://mirrors.ibiblio.org/pub/mirrors/maven2/[organisation]/ [module]/[branch]/[revision]/[branch]-[revision].[ext]" /> </url> </chain> </resolvers> </ivysettings>法从第一个存储库下载 — 比如此存储库宕机,或者文件未在指定位置 — 它将尝试第二个位置。优点在于,一旦 Ivy 下载了一个 JAR,它就会将文件置入您的本地文件系统,不必再为每一次构建重新下载这些文件。
cobertura模块及其所有依赖模块,如清单 5 中所示的 ivy.xml 文件那样。切记,这个 ivy.xml 文件与 cobertura-1.9.jar 文件位于同一目录。
objectweb org和名称 asm以及要使用的特定修订版。Ivy 将此信息与 ivysettings.xml 文件中的存储库定义(如 清单 4 所示)一起使用,用于下载 JAR 文件的依赖项。 图 2 展示了符合 清单 4 所示 ivysettings.xml 文件配置的存储库中的目录结构: ![]() 请注意,图 2 展示了一个 ivy.xml 文件(见清单 6),它定义了 asm的依赖项。 在清单 6 中,针对 asm模块的 ivy.xml 文件片段表示了它惟一的依赖项 — asm-tree-2.2.1.jar:
cobertura模块定义了三个依赖模块: asm、 jakarta-oro和 log4j,如 清单 5 所示。而 asm模块又有一个依赖模块,名为 asm-tree,如 清单 6 所示。 请注意,图 3 中的 asm-tree目录结构与 图 2 中的 asm模块结构相似: ![]() 当然,差别在于 JAR 文件包含不同的类,图 2 所示的 ivy.xml 文件的定义描述了 asm-tree模块。(碰巧, asm-tree模块未在其 ivy.xml 文件中定义任何依赖项。)
Ivy 提供了一个任务,用于报告一个项目中的依赖文件。清单 7 展示了如何调用 Ivy 的 reportAnt 任务来创建依赖项列表:
![]() 还有其他许多针对 Ivy 的 Ant 任务可供您使用 — 通过为 Maven 生成一个 POM 文件来清理本地文件系统缓存。表 1 显示了部分 Ivy 的 Ant 任务及其用途:
学习 您可以参阅本文在 developerWorks 全球站点上的 英文原文 。 Apache Ivy:访问 Ivy 项目网站,查看文档、教程和社区资源。 "Ivy in 4.2 steps" (Andrew Glover,testearly.com,2007 年 6 月):通过几个简单的步骤使 Ivy 开始运行。 Ivy / Maven2 Comparison(Apache Ant Ivy 项目):Ivy 与 Maven 2 依赖项管理之间的差异探讨。 Ant in Action (Steven Loughran 和 Erik Hatcher,Manning,2007年):这是一本出色的书籍,其中的第 11 章专门探讨使用 Ivy 进行依赖项管理的内容。 让开发自动化 (Paul Duvall,developerWorks):阅读整个系列文章。 浏览 技术书店,查看关于上述和其他技术主题的书籍。 developerWorks Java 技术专区:数以百计的文章,介绍 Java 编程的所有方面。 获得产品和技术 Ant:下载 Ant,开始以可预计、可重复的方式构建软件。 Ivy:下载 Ivy。 讨论 Improve Your Code Quality 论坛:developerWorks 的杰出专栏作者 Andrew Glover 以顾问的身份在此论坛中贡献他丰富的专业技术,主要关注改进代码质量的问题。 Accelerate development space:developerWorks 的杰出专栏作者 Andrew Glover 运作的一站式门户,包含开发人员测试、持续集成、代码度量和重构等内容。 访问 developerWorks blog,加入 developerWorks 社区。
|
相关文章推荐
- 让开发自动化: 利用 Ivy 管理依赖项
- 让开发自动化: 利用 Ivy 管理依赖项
- android开发步步为营之73:Android开发常见问题技术点总结之二
- 常见网站开发技术之三:DWR
- PHP实现日志处理类库 - 【微信开发之微电商网站】技术笔记之二
- 利用PHP开发网站的技术知识分享
- JSP简介以及常见动态网站开发技术(Asp.net、Php、Jsp)
- ASP.NET 是微软所提供的网站开发技术。程序设计师可以利用这些技术建置一个网站/页应用程序。
- 网站内容管理平台java利用模板技术生成静态html
- 常见网站开发技术之一:使用Log4j进行日志操作
- 插件化开发系列之二—动态加载技术加载已安装和未安装的apk
- 谁这有用struts2.0+spring+hibernate技术开发的日报管理系统啊
- 当下10大最热门的网站开发技术
- 当下10大最热门的网站开发技术
- 敏捷开发团队管理系列之二:程序与测试团队I
- 技术开发团队的项目管理工具
- 软件开发人员怎样走好从技术到管理之路?
- ASP.NET动态网站开发培训-28.完善论文管理系统
- 使用Ivy管理项目中的依赖
- 使用Jquery+EasyUI 进行框架项目开发案例讲解之二---用户管理源码分享