首先,Ivy不是Maven;)
Maven2是一个软件项目管理和理解工具,而Ivy只是一个依赖管理工具。
Ivy在很大程度上依赖于一种称为配置的独特概念。
在Ivy中,模块配置是使用或查看模块的一种方式。
例如,您可以在模块中进行测试和运行时配置。但你也可以有一个MySQL和一个Oracle配置。或者休眠和 JDBC 配置。
在每个配置中,您可以声明:
- 需要什么文物(罐子,战争等)。
- 您对其他模块的依赖关系,并描述您需要的依赖关系配置。这称为配置映射。
因此,conf 属性正是这样做的:描述依赖项的配置映射。
映射的子元素是“符号的右侧”,表示映射的依赖项配置的名称。 通配符可用于指定此模块的所有配置。->
'*'
參見更多關於 Charlie Hubbard 的「最簡單的常春藤配置解釋」
其中重要的部分是Ivy下载依赖项并组织它们。
常春藤模块(即文件)有两个主要部分:ivy.xml
第一部分在元素下配置。
第二个由元素控制<dependencies>
<configurations>
当 Ivy 下载这些依赖项时,它需要知道在提取这些传递依赖项时要使用哪些作用域(我们是否将其用于测试、运行时、编译等?)。我们必须告诉 Ivy 如何将我们的配置映射到 Maven 示波器,以便它知道要拉取什么。
Maven2在其侧面有一种叫做范围的东西。
可以将依赖项声明为测试范围或生成时范围的一部分。
然后,根据此作用域,你将获得依赖项项目(在 maven2 中每个模块只有一个项目)及其依赖项,具体取决于其作用域。作用域在 maven2 中是预定义的,您无法更改它。
这意味着:
为许多库下载了许多不必要的依赖项。
例如,Hibernate下载了一堆JBoss JAR,Display Tag下载了所有各种Web框架JAR。我发现自己排除的依赖项几乎与我添加的依赖项一样多。
问题是休眠可以与几个缓存实现,几个连接池实现一起使用,...这不能用示波器来管理,其中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
你可以找到那些“proxool,...”参数,方法是列出为与库关联的每个模块定义的 Ivy 配置。例如:
<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
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*" />