首先,Ivy 不是 Maven ;)
Maven2 是一个软件项目管理和理解工具,而 Ivy 只是一个依赖管理工具。
Ivy 在很大程度上依赖于一个称为配置的独特概念。
在 Ivy 中,模块配置是一种使用或查看模块的方式。
例如,您可以在模块中进行测试和运行时配置。但您也可以拥有 MySQL 和 Oracle 配置。或者 Hibernate 和 JDBC 配置。
在每个配置中,您可以声明:
- 需要什么工件(jar,war,...)。
- 您对其他模块的依赖关系,并描述您需要的依赖项配置。这称为配置映射。
所以conf属性正是这样做的: 描述依赖项的配置映射。
映射的子元素是您的“符号右侧->
”,表示映射的依赖项配置的名称。'*'
通配符可用于指定该模块的所有配置。
在查理哈伯德的“常春藤配置的最简单解释”中查看更多信息
其中重要的部分是 Ivy 下载依赖项并组织它们。
一个常春藤模块(即ivy.xml
文件)有两个主要部分:
第一部分配置在<dependencies>
元素下。
第二个由<configurations>
元素控制
当 Ivy 下载这些依赖项时,它需要知道在拉取这些传递依赖项时要使用什么范围(我们是为了测试、运行时、编译等而拉取它吗?)。我们必须告诉 Ivy 如何将我们的配置映射到 Maven 范围,以便它知道要拉取什么。
Maven2 本身有一个叫做scope的东西。
您可以将依赖项声明为测试范围或构建时范围的一部分。
然后根据这个范围,您将获得依赖项工件(maven2 中每个模块只有一个工件),其依赖项取决于它们的范围。范围是在 maven2 中预定义的,您无法更改它。
这意味着:
许多库下载了很多不必要的依赖项。
例如,Hibernate 下载一堆 JBoss JAR,而 Display Tag 下载所有各种 Web 框架 JAR。我发现自己排除了几乎和我添加的一样多的依赖项。
问题是 hibernate 可以与多个缓存实现、多个连接池实现一起使用……而这不能通过范围进行管理,而 Ivy 配置为此类问题提供了一个优雅的解决方案。
例如,在 Ivy 中,假设 hibernate 有一个像这样的 Ivy 文件,那么你可以像这样声明一个依赖项:
<dependency org="hibernate" name="hibernate" rev="2.1.8" conf="default->proxool,oscache"/>
使用它的 proxool 和 oscache 实现来休眠,就像这样:
<dependency org="hibernate" name="hibernate" rev="2.1.8" conf="default->dbcp,swarmcache"/>
使用 dbcp 和 swarmcache 进入休眠状态。
通过将您的默认master
配置映射到“ proxool,oscache
”或“ ”,您可以从模块“休眠”中准确dbcp,swarmcache
指定您需要的内容。
您可以通过列出为与库关联的每个模块定义的 Ivy 配置来找到这些“proxool,...”参数。例如:
<ivy-module version="2.0">
<info organisation="ssn-src" module="pc"/>
<configurations defaultconfmapping="default->default">
<conf name="default" />
<conf name="provided" description="they are provided by the env." />
<conf name="compile" extends="default,provided" />
<conf name="war" extends="default"/>
</configurations>
<dependencies>
示例:
假设modA
有两个配置,默认和测试。
实际上,想要省略conf
依赖元素的属性是非常不寻常的。for可能有依赖关系
:ivy.xml
modA
<dependency org="theteam" name="modB" rev="1.0" conf="default->*" />
您从默认开始,而不是从默认和测试开始。
上面的例子使 modA 的默认值依赖于 modB 的 conf1、conf2 和 conf3。
或者你可能想说 modA 的默认值只取决于 modB 的 conf1:
<dependency org="theteam" name="modB" rev="1.0" conf="default->*conf1*" />