一个项目的Ivy文件(ivy.xml)主要定义了项目的三部分内容: 项目本身属性:例如开发项目的组织名称,项目名称、项目版本、项目状态、发布日期等; 项目发布产品的定义:逐条列出项目发布的产品,每个产品条目包括:产品名称、产品类型、产品扩展名等; 项目依赖产品的定义:逐条列出产品运行和发布所需要的依赖包的列表,每个依赖包条目包括:该依赖包的组织名、模块名、版本号以及其他特征说明; 为了增加ivy的管理能力以应对复杂的实际应用环境,Ivy提供了配置(configuration)功能,一个配置包含两方面的内容,首先是属于此配置的产品,其次是属于此配置的依赖包。Ivy的依赖管理不是建立在产品的基础上,而是建立在配置的基础上,例如模块(项目)MA的产品AA需要将模块MB的产品AB(jar包)添加到classpath中才能运行,在Ivy文件中不是声明“AA依赖于AB”,而是需要声明“MA的配置CA依赖MB的配置CB”,也就是在MA的ivy.xml文件中会有:
由于一个配置对应一个产品,因此上面的声明实际意思是说:CA对应的AA依赖于CB对应的AB。产品与配置的对应关系在
Ivy查找jar包的工作过程
以上面的定义为例,MA搜索MBjar包的过程是: 第一步:MA根据项目指定的ivysetting.xml文件中的defaultResolver属性找到用哪个resolver解析MA的ivy.xml文件的dependency条目,这里是chain-repo,它的第一个解析器chain-release的解析模式是:"${release.repo.dir}/[organisation]/[module]/[type]s/[artifact]-[revision].[ext]",所以ivy会去 "sftp://godu:bocogodu@10.0.2.47:22/opt/ArtifactRepo/ReleaseArea/[organisation]/[module]" 这个路径下寻找jar包,具体到 这一条目,用OB替换[organisation],用MB替换[module],变成了 sftp://godu:bocogodu@10.0.2.47:22/opt/ArtifactRepo/ReleaseArea/OB/MB(后面简写为“OB/MB”); 第二步:找到OB/MB后,根据chain-release下面的ivy pattern的定义,找到下面的ivys文件夹里的ivy-2.1.xml文件,此文件中的 "sftp://godu:bocogodu@10.0.2.47:22/opt/ArtifactRepo/ReleaseArea/OB/MB/jars/AB-2.1.jar",这个jar包就被作为MB项目发布的AB这个jar包被MA项目引用了。 如果OB/MB下没有ivys/ivy*.xml文件,则artifact默认值是模块名MB,type是jar,ext是jar,所以当需要向产品库里增加单独的jar包时(不是来自Maven Repository),需要首先确定该包的 org 、 module 、 revision 三个属性,然后将jar包命名为 module - revision .jar放在 org / module /jars目录下即可。 上述ivysettings.xml文件内容如下: 采用这种方式,可以解决以下几种复杂情况。
一个模块发布多个产品
例如模块MB发布了一个制作报表工具,这个工具有一套统一的API,只要调用这套API就能制作出各种各样的报表,包含API和XP风格报表实现的产品名为AB_XP(需要第三方包DEP_XP才能运行),包含API和苹果风格报表的产品名为AB_APPLE (需要第三方包DEP_APPLE才能运行),MB的ivy文件应为(这里DEP_XP和DEP_APPLE分别定义在mod_xp和mod_apple的default配置中): <?xml version="1.0" encoding="UTF-8"?>
模块MA是一个自动测试工具,测试完成后需要用模块MB提供的工具生成测试结果报告,MA发布两个产品:AA_XP(生成XP风格报表,需引用AB_XP)和AA_APPLE(生成苹果格式的报表,需引用AB_APPLE),则MA的ivy文件应为: <?xml version="1.0" encoding="UTF-8"?> 这样模块MA中的ivy进行解析(resolve)的时候,不仅会引用产品AB_XP和AB_APPLE,也会引用DEP_XP和DEP_APPLE,如果将上面 <?xml version="1.0" encoding="UTF-8"?> ...... ...... 另外一种解决方法是把dep_15手工加到MA的依赖中,这时可为MB建立一个"Nontransitive"配置(习惯上称为master):仅在 使用这种master配置要注意的是:在 如果被依赖项目可能有master配置,可用后备配置:conf="compile->master(*)",即当master配置不存在时,使用任何配置。