DarkMatter in Cyberspace
  • Home
  • Categories
  • Tags
  • Archives

Ivy的配置管理


一个项目的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文件,此文件中的一节中,CB这个配置对应的artifact名称是AB,type是jar,ext是jar,因此chain-release下面的artifact pattern就被翻译成了:

"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,如果将上面里的transitive="true"改为transitive="false",则只引用AB_XP和AB_APPLE,不引用DEP_XP和DEP_APPLE。 产品的部分依赖 假设模块MB的产品AB的功能很多,实现所有功能所依赖的第三方包有50个(dep_1~dep_50),模块MA的产品AA只需要使用AB的一个功能,而这个功能只需要dep_15一个三方包,这时如果采用transitive="true"方式引用AB,则会把所有50个三方包都引入到AB的lib中,体积会很大,用配置就可以在AB中为AA专门定制一个conf,使transitive="true"方式下AA只取AB和dep_15,AB的ivy.xml如下:

<?xml version="1.0" encoding="UTF-8"?>

......

......

另外一种解决方法是把dep_15手工加到MA的依赖中,这时可为MB建立一个"Nontransitive"配置(习惯上称为master):仅在里出现,而不出现在中,实例可参见很多Maven库里第三方包的ivy.xml文件。这样master配置不包含任何依赖,即使写MA的依赖时注明transitive="true",也引不到任何MB的依赖包。

使用这种master配置要注意的是:在中所有条目都不能省略conf="..."。当MB的被依赖项目之一dep_x只有jar包没有ivy配置时,如果省略conf部分,则该依赖对所有配置生效(包括master),这时MB的master就不完全是"Nontransitive"了,而是包括省略conf的条目(dep_x),如果MA依赖MB的master,就会把dep_x也引过来,解决办法就是在MB的的dep_x条目中标明:conf="compile->"(其中compile是用于MB自己编译的配置)。 依赖配置的通配和后备机制 在依赖配置中,如果被依赖的项目只有jar包,没有ivy配置,或者不清楚被依赖项目的配置情况,可用星号(“”)表示任何配置,例如:conf="compile->*";

如果被依赖项目可能有master配置,可用后备配置:conf="compile->master(*)",即当master配置不存在时,使用任何配置。



Published

Dec 3, 2010

Last Updated

Dec 3, 2010

Category

Tech

Tags

  • Ivy 19
  • 配置 3

Contact

  • Powered by Pelican. Theme: Elegant by Talha Mansoor