1. 什么是Apache Ivy? html
Apache Ivy 是一个强大的依赖管理软件,它支持传递性依赖和其余更多的功能。 mysql
使用Apache Ivy, 你能够在xml文件里定义本身的模块依赖关系,这个xml 文件就是ivy文件。而后你能够经过Apache Ivy将你须要的依赖包下载到本地的lib文件夹。 sql
2. 为何咱们要使用依赖管理器? apache
若是没有依赖管理,咱们一般有两种方式来存储工程的依赖关系:工程的lib文件夹或者直接访问共享库 oracle
使用lib文件夹最大的缺点在于若是有多个工程使用相同的依赖,那么这些依赖可能存在不一样的地方。并且,咱们常常会看到工程依赖项的修正并无记录下来,这样就会有维护问题。 app
若是使用共享库,问题在于咱们要常常维护工程的依赖项列表。而这项列表并不在build文件中,这也带来了维护的问题。并且这个解决方案常常要求下载整个库,除非使用了本身的依赖管理方案 maven
这些解决方案的另外一个主要缺点在于它们并无使用传递性依赖。传递性依赖就是依赖关系的依赖关系。管理传递性依赖只要你声明你真正须要的依赖,而不是你使用的组件所须要的依赖。这不只仅减轻了你的依赖声明,并且很大程度提升了工程的可维护性,尤为是在多项目的环境下。想象一下你开发了一个要使用在其余几个工程中使用的组件。在没有传递性依赖的状况下,那么每当你的组件须要一个新的依赖关系,你都要去更新全部使用你组件的工程!而这将会须要很多的时间! 工具
3.为何要使用Apache Ivy? 测试
从Ivy的features 和Apache提供的产品比较里,你会发现Apache Ivy是当前可用的最好的依赖管理工具之一 ui
4.Apache Ivy 和Apache Maven有什么不一样?
http://ant.apache.org/ivy/m2comparison.html
首先,也是最重要的不一样之处:它们两个根本不是同一种工具。
Apache Maven 是一种软件醒目关系的综合工具,然而Apache Ivy只是一个依赖管理工具,和流行的构建管理工具Apache Ant高度集成。因此更有趣的比较应该是比较Apache Ant+Ivy 和Apache Maven。可是这个已经超出了依赖管理的范围。
其次,它们两个有不一样的思想。
Apache Ivy 严重依赖一个独特的概念称为配置。在Apache Ivy里,一个模块配置是使用或者查看模块的一种方法。例如,你能够在你的模块测试和运行的配置,可是你也能够有mysql和oracle的配置,或者hibernate和jdbc的配置。在每个配置里,你能够声明什么样的组件(jar,war,...)是必需的。一样在每个配置里,你也能够声明对其余模块的依赖,描述你须要什么样的依赖配置。这叫作配置映射(configuration mapping),它是一种很是灵活的方法,能够用来回答咱们常常在软件开发中所遇到的不少问题。
Apache Maven方面有它们称为scope的概念。你能够声明一个依赖做为测试scope的一部分,或者编译时的scope。而后根据这个scope你能够获得依赖组件(每一个模块一个组件),而这个组件的依赖关系取决于他们的scope。Scope 是预约义的,你不能改变它们。没法建立一个oracle scope。No way to indicate you need what has been declared to be needed in the runtime scope of your dependency in your compile one. Everything here is written in the marble.
文档
可以很快上手并使用某个工具,它的文档是必不可少的。Apache Ivy的参考文档不少,涵盖了全部的特性并包括
不少例子。还提供了一些用新版本Ivy维护的官方教程以及从版本2.0.0-alpha2之后的在线的不一样版本的文档。
Apache Maven, 很难清楚的知道什么能够被认为是依赖管理文档,只有不多的一部分:一些小的入门指南,pom条目指南。即便在能够免费获得的maven书里也没有很详细的讲解,如何理解依赖管理仍是在于读者的我的观点。
冲突管理
冲突管理是依赖管理的重要一部分,当你处理传递性依赖时常常会碰到冲突。在这个领域,Apache Ivy让你作任何你想要的:在某个模块中使用冲突管理器,在其余地方,决定你将要获得哪个版本,...你甚至能够在须要的时候插入你本身的冲突管理器
Apache Maven的冲突管理至关简单:获取最接近的定义?(the principle is to get the nearest definition)。
因此若是你的模块依赖于foo1.0, 若是你不修改你本身的依赖声明(dependency declaration),你的任何依赖关系都不会获得foo1.1. 这种方式也许在某些状况下可行,可是其余状况就很差说了...
灵活性
在Apache Ivy里,不少东西都是可配置的,还有其余一些是能够插入的:依赖解析器,冲突管理,最新修订策略...
Apache Maven也提供了可插入库,可是并非不少。此外,哭的配置并无Apache Ivy灵活:没有库链接,没法在多个库里分离原数据和组件(metadata and artifacts)...
公共存储库
Apache Maven 配置使用maven2 存储库,其中包含不少模块(both artifacts and module descriptors).
惟一的问题多是模块描述符并不老是被检查过的,因此有些不是很好写。
Apache Ivy 兼容maven2原数据,默认使用的也是maven2的存储库。
然而咱们并不推荐使用这样的一个公共存储库做为企业构建系统,并且Ivy 自己就提供了不少特性和文档去构建你本身的企业存储库,基于(或者不基于)公共存储库已有的数据