- 浏览: 3473211 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
wanglf1207:
EJB的确是个不错的产品,只是因为用起来有点门槛,招来太多人吐 ...
weblogic-ejb-jar.xml的元素解析 -
qwfys200:
总结的不错。
Spring Web Flow 2.0 入门 -
u011577913:
u011577913 写道也能给我发一份翻译文档? 邮件437 ...
Hazelcast 参考文档-4 -
u011577913:
也能给我发一份翻译文档?
Hazelcast 参考文档-4 -
songzj001:
DbUnit入门实战
实际上,所有软件开发项目都必须依靠来自其他项目的源代码。例如,许多项目可能依靠 log4j 等日志记录工具和 Struts 之类的 Web 框架。您的开发团队不会维护其他项目的源代码,但要依靠其 API 来实现项目中的定制软件。您的软件所依靠的其他项目数量越多(包括这些项目自身的依赖项),构建软件就变得越复杂。
我已经看到许多团队使用各种不完善的技术,尝试解决这种难题:
- 将全部有依赖关系的项目(JAR 文件)放在一个目录中,此目录将签入项目的版本控制存储库。这种技术不必要地增加了存储库的大小,使得管理版本差异极为困难。
- 将有依赖关系的 JAR 分配到一个公共文件服务器上,使团队无法控制版本更改。
- 手动将 JAR 文件复制到各开发人员工作站上的指定位置。这种方法使得确定丢失的文件或修正版本极为困难。
- 执行一条 HTTP
Get
命令,将文件下载到开发人员的工作站,手动执行或将其作为自动构建的一部分。这种技术会造成未受管理的 JAR 文件。
我参加过一个中型项目,包含 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 任务:ivy:settings
和 ivy:retrieve
。
<target name="init-ivy" depends="download-ivy"> <ivy:settings file="${basedir}/ivysettings.xml" /> <ivy:retrieve /> </target> |
在 中,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"
- dest = "${ivy.jar.file}" usetimestamp = "true" />
- </ target >
- </ project >
中的第二行定义了 XML 名称空间。antlib
在 ivy.jar 文件中引用 antlib.xml。其余的 xmlns
指明了 ivy
Ant 任务的完全限定路径。${user.home}/.ant
的 ivy.home
值是 ivy.jar 文件下载的目标位置。taskdef
定义了 ivy
Ant 任务,引用其类路径的位置。download-ivy
目标下载 ivy-2.0.0-beta2.jar 并使用 dest
属性为其重命名。
一旦下载并配置了 Ivy,就可以使用任意 Ivy Ant 任务(如 中调用的两个任务)。
tle>创建配置脚本
ivy.xml 文件是必不可少的,您在此文件中定义项目的全部有依赖关系的 JAR。清单 3 展示了一个示例:
- <? xml version = "1.0" encoding = "ISO-8859-1" ?>
- <? xml-stylesheet type = "text/xsl" href = "./config/ivy/ivy-doc.xsl" ?>
- < ivy-module version = "1.0" >
- < info organisation = "com" module = "integratebutton" />
- < dependencies >
- < dependency name = "hsqldb" rev = "1.8.0.7" />
- < dependency name = "pmd" rev = "2.0" />
- < dependency name = "cobertura" rev = "1.9" />
- < dependency name = "checkstyle" rev = "4.1" />
- < dependency name = "junitperf" rev = "1.9.1" />
- < dependency name = "junit" rev = "3.8.1" />
- </ dependencies >
- </ ivy-module >
请注意, 未表示任何文件位置或 URL,允许您转到其他目录位置,而无需更改依赖项列表。info
元素中的 organisation
属性标识了组织类型(如 .net、.org 或 .com)。后接 module
名称。此模块的依赖项列表遵循一种命名规范,在下一个清单中您将更清晰地看出此规范。目前,只需记住 dependency name="cobertura" rev="1.9"
将转换为 cobertura-1.9.jar 即可。
清单 4 是 Ivy 设置文件的示例。它定义了 中 ivy.xml 文件所用的存储库位置和相关模式。
- < 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" />
- &nb
- sp; < url name = "ibiblio-mirror" >
filesystem
元素定义了本地工作站上的位置模式。两个 url
元素定义了可用于下载 JAR 文件的多个位置:第一个元素定义了受我控制的 integratebutton.com
上的一个自定义存储库;第二个元素定义了包含大量开源 JAR 文件的外部 Maven 存储库(不受我控制)。如果 Ivy 无法从第一个存储库下载
— 比如此存储库宕机,或者文件未在指定位置 — 它将尝试第二个位置。优点在于,一旦 Ivy 下载了一个
JAR,它就会将文件置入您的本地文件系统,不必再为每一次构建重新下载这些文件。
一个模块常常要依赖其他模块。例如,在
中可以看到,cobertura-1.9.jar 文件的多个依赖项中包括 asm-2.2.1.jar,而 asm-2.2.1.jar 又依赖于
asm-tree-2.2.1.jar。如果没有像 Ivy 这样的工具,您就需要确保类路径中存在这些 JAR 的正确版本,保证 JAR
版本之间不存在冲突。而使用 Ivy,您只需定义 cobertura
模块及其所有依赖模块,如清单 5 中所示的 ivy.xml 文件那样。切记,这个 ivy.xml 文件与 cobertura-1.9.jar 文件位于同一目录。
- <? xml version = "1.0" encoding = "UTF-8" ?>
- < ivy-module version = "2.0"
- xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
- xsi:noNamespaceSchemaLocation = "http://ant.apache.org/ivy/schemas/ivy.xsd" >
- < info organisation = "cobertura" module = "cobertura" revision = "1.9" />
- < configurations >
- < conf name = "master" />
- </ configurations >
- < publications >
- < artifact name = "cobertura" type = "jar" conf = "master" />
- </ publications >
- < dependencies >
- < dependency org = "objectweb" name = "asm" rev = "2.2.1" conf = "master" />
- < dependency org = "jakarta" name = "oro" rev = "2.0.8" conf = "master" />
- < dependency org = "apache" name = "log4j" rev = "1.2.9" conf = "master" />
- </ dependencies >
- </ ivy-module >
所示)一起使用,用于下载 JAR 文件的依赖项。
图 2 展示了符合 所示 ivysettings.xml 文件配置的存储库中的目录结构:
图 2.
asm
模块的目录结构
请注意,图 2 展示了一个 ivy.xml 文件(见清
单 6),它定义了 asm
的依赖项。 在清单 6 中,针对 asm
模块的 ivy.xml 文件片段表示了它惟一的依赖项 — asm-tree-2.2.1.jar:
清单 6. 为
asm
定义依赖项的 ivy.xml
... <dependencies> <dependency org="objectweb" name="asm-tree" rev="2.2.1" conf="master"/> </dependencies> ... |
简单说明一下,cobertura
模块定义了三个依赖模块:asm
、jakarta-oro
和 log4j
,如 所示。
请注意,图 3 中的 asm-tree
目录结构与 中的 asm
模块结构相似:
图 3.
asm-tree
模块的目录结构
当然,差别在于 JAR 文件包含不同的类,图 2 所示的 ivy.xml 文件的定义描述了 asm-tree
模块。(碰巧,asm-tree
模块未在其 ivy.xml 文件中定义任何依赖项。)
既然您已经掌握了使用 Ivy 的基本知识,下面我将介绍其他一些有用的 Ant 任务。
Ivy 提供了一个任务,用于报告一个项目中的依赖文件。清单 7 展示了如何调用 Ivy 的 report
Ant 任务来创建依赖项列表:
<target name="ivy-report" depends="init-ivy"> <ivy:report todir="${target.dir}/reports/ivy"/> </target> |
中的脚本生成了一份 HTML 报告,显示了某项目的依赖文件列表。图 4 展示了该报告:
还有其他许多针对 Ivy 的 Ant 任务可供您使用 — 通过为 Maven 生成一个 POM 文件来清理本地文件系统缓存。表 1 显示了部分 Ivy 的 Ant 任务及其用途:
settings
|
对于验证包含存储库的主机最有用 |
cachepath
|
覆盖本地文件系统上的默认缓存路径,所下载的文件将存放在此路径中 |
repreport
|
为存储库中的几个模块生成报告 |
install
|
安装一个模块及其所有依赖项 |
makepom
|
通过 ivy.xml 文件创建一个 pom.xml file,供 Maven 使用 |
cleancache
|
清理本地文件系统缓存,强制在下一次构建时从存储库重新检索 JAR 文件 |
参见 ,了解 Ivy 中可用的其他 Ant 任务。
|
Ivy 集中管理依赖文件,消除了开发团队将 JAR 文件从一个版本控制存储库复制到另一个存储库中时可能出现的膨胀现象。如果您正参与一个简单的项目,将 JAR 文件签入版本控制系统或使用本文开头列出的其他某些技术可能不会显著降低您的速度。但若您的项目规模越来越大,或者您在使用公共文件的企业环境中工作,一 种公共方法就变得十分必要。无论是哪种情况,Ivy 都能使定义项目依赖项更为一致、更为可行。因此值得您付出时间研究 Ivy 在您的项目中的应用。
发表评论
-
字符串分割--java中String.split()用法
2013-03-06 14:25 74097在java.lang包中有String.sp ... -
用 HttpServletResponseWrapper 实现 Etag 过滤器
2012-07-09 16:58 3709原文出处:http://blog.chenlb.com/200 ... -
Fitnesse使用
2012-05-05 13:27 23424Fitnesse 的使用 一,介绍 Fitnesse是一种 ... -
Customizing the new FitNesse parser
2012-05-05 13:13 2092FitNesse began its life using ... -
java application中内嵌ActiveX控件
2011-11-14 15:57 5468我这里用的是SWT/JFace开发application,SW ... -
Google Java Developer Tools Downloads
2011-08-09 00:04 2309WindowBuilder Pro原来叫WindowB ... -
Jalita
2011-08-06 00:49 1524Jalita (Java light terminal ada ... -
【转】用Java写字符终端界面
2011-07-29 13:13 2081终端界面GUI开源项目charva。 这个框架让你可以用开发 ... -
[转]mybatis下的分页,支持所有的数据库
2011-07-21 13:21 14788大 家都知道,mybatis的自带分页方法只是逻 ... -
Java framework for text- & console-based forms?
2011-07-21 01:06 1674charva jcurses JNA , ... -
JNA(Java Native Access)学习入门
2011-07-21 01:04 22526Java Native Access 项目 在 ... -
JAVA上加密算法的实现用例
2011-06-25 12:38 4839来源:www.ibm.com ... -
如何将GlassFish作为Windows服务运行
2011-05-18 23:21 2316本文档来自GlassFish官方网站,详细介绍了将 G ... -
JAVA UDP打洞必备知识点---NAT
2011-05-05 12:56 8611一、引言 RFCl631 ... -
Keystore概念,Keytool工具使用
2011-04-28 16:20 2866近来由于项目需要做Single Sign On, 研究了一 ... -
利用Eclipse Profile Plugin监控分析Tomcat性能
2011-04-18 16:14 3672目前新版本的Eclipse在启动应用服务器的时候有一个新的选 ... -
m2eclipse: Eclipse is running in a JRE, but a JDK is required
2011-02-04 23:43 2512Eclipse 安装了Maven插件,启动Eclipse ... -
利用JNative实现Java调用动态库
2010-10-18 00:43 2061由于项目要求,需要用J ... -
RHEL5支持大内存
2010-10-08 16:19 2954安装 RHEL 5 ,硬件为 4G 内存,安装完成 ... -
Windows Server 2003 和 Windows 2000 提供大内存支持
2010-10-08 16:19 1819本文介绍物理地址扩展 ...
相关推荐
Maven坐标:org.apache.ivy:ivy:2.4.0; 标签:apache、ivy、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持...
ivy-todo:使用ivy管理组织模式下的TODO
使用系统的包管理器安装此包,或使用以下命令: $ sudo dpkg -i ms-ivy_X.X_YYYY.deb$ sudo apt-get install -f第一个命令将报告丢失的依赖项,第二个命令将安装这些依赖项。视窗Windows 二进制分发版采用 zip 存档...
Maven坐标:org.apache.ivy:ivy:2.4.0; 标签:apache、ivy、jar包、java、API文档、中英对照版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和...
liferay开发需下载的.ivy
ngcc验证 该存储库旨在验证Angular Ivy兼容性编译器( ngcc )。 每个目录都包含一个项目,该项目使用流行的Angular软件包,该软件包与ngc生成的metadata.json文件一起分发。... 安装顶级依赖项: cd ngcc-validation
Poison Ivy 2.3.2版本,包含win7编译器。使用方法:生成C array格式的服务端,打开patcher,将生成的代码全部拷入patcher编辑框,点击patch it键(可能因为程序界面问题遮盖住不显示,让光标位于编辑框内然后按tab键...
Apache Ivy:trade_mark:什么是Apache Ivy? Apache Ivy是用于管理(记录,跟踪,解决和报告)项目依赖项的工具。 它具有以下特点: 灵活性和可配置性Apache Ivy本质上与过程无关,并且不依赖于任何方法或结构。 相反...
Laravel开发-ivy 常春藤OMP
项目中jar包管理工具,使得jar包可以以配置文件的形式管理,避免两个工程对相同jar包的重复使用
NULL 博文链接:https://wuquanyin1011.iteye.com/blog/688167
org.apache.ivy_2.4.0.final_20141213170938.jar
本项目基于eclipse中安装ivy插件后,同时配置ivy的setting(不配置默认从 https://repo1.maven.org/maven2/下载到本地用户ivy缓存目录),创建简单java项目并加入ivy file(如下图所示),再加入项目所需的依赖包,...
idea ant编译ivy.xml依赖包(下载后放到idea安装目录/lib/ant/lib下)
注意:该文件是由从ivy-posframe.el自动转换而来的,请不要手工编辑!!!目录ivy-posframe自述文件什么是常春藤ivy-posframe是ivy的扩展,它使ivy使用posframe来显示其候选菜单。 注意:ivy-posframe需要Emacs 26,...
巴卡拉Bacala 是 Scala 项目的实验性包依赖管理器。项目目标该项目的目标是: 使用 SAT 求解器作为核心算法提供定义良好的 API 和命令行接口跑步要解析 POM 文件: ./maven data/pom/github-api.xml解析 Ivy 文件 ./...
ivy-2.5.0.jar
-experimental-ivy 生成并运行通用应用程序安装npm ci (要在package-lock.json中获得完全固定的版本)在生产模式下运行(以查看实际的JS有效负载大小) npm run start 导航到在开发人员模式下运行(用于开发) ...
sbt-updates:sbt插件,可以检查Maven和Ivy存储库中的依赖项更新
一个ML转译器和框架,支持多个主流的机器学习框架,如JAX、TensorFlow...Ivy的目标是统一这些不同的ML框架,使开发者能够在任意一个框架中编写代码,并且可以将在不同框架中编写的函数、模型或库转换为自己首选的框架。