首先,Ivy不是Maven;)
Maven2是一个软件项目管理和理解工具,而Ivy只是一个依赖项管理工具。
常春藤严重依赖于称为配置的独特概念。
在Ivy中,模块配置是使用或查看模块的一种方式。
例如,您可以在模块中进行测试和运行时配置。但是您也可以使用MySQL和Oracle配置。或Hibernate和JDBC配置。
在每种配置中,您可以声明:
- 需要什么工件(罐子,战争,...)。
- 您对其他模块的依赖关系,并描述所需的依赖关系配置。这称为配置映射。
因此,conf属性精确地做到了这一点:描述依赖项的配置映射。
该映射的子元素是你的“右手边->
符号”,并表示映射的依赖配置的名称。'*'
通配符可用于指定此模块的所有配置。
请参阅Charlie Hubbard的“常春藤配置的最简单说明”中的更多内容
其中的重要部分是Ivy下载依赖项并组织它们。
常春藤模块(即ivy.xml
文件)具有两个主要部分:
第一部分配置在<dependencies>
元素下。
第二个由<configurations>
元素控制
当Ivy下载这些依赖项时,它需要知道在提取这些传递性依赖项时要使用的范围(我们是否将其用于测试,运行时,编译等)?我们必须告诉Ivy如何将我们的配置映射到Maven范围,以便它知道要提取的内容。
Maven2本身有一个叫做scope的东西。
您可以将依赖项声明为测试范围或构建时范围的一部分。
然后根据此范围,您将获得依赖项工件(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
”,可以从“休眠”模块中确切指定所需的内容。
通过列出为与该库关联的每个模块定义的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
依赖项元素的属性将是非常不寻常的。
在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*" />