posts - 56, comments - 77, trackbacks - 0, articles - 1
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Ivy: 搭建本地仓库

Posted on 2007-12-23 23:22 切尔斯基 阅读(4626) 评论(0)  编辑  收藏

基本上, 搭建一个本地的ivy仓库, 包含两件独立的事情: 搭建仓库本身, 和配置如何使用这个仓库

仓库本身

Ivy的Repository是由一个个Module组成的, Module则包含自身的artifacts(通常是jar文件)和描述文件.

Module的描述文件是ivy的核心, 里面记录了这个module包含哪些artifacts和这个module对其它module的依赖. 这样就能顺藤摸瓜, 牵出所有的依赖来

<ivy-module version="1.0">

<info organisation="your.company" module="your.project" />

<configurations>

<conf name="release" />

<conf name="testing" extends="release" />

</configurations>

<publications>

<artifact name="common" />

<artifact name="client" />

<artifact name="server" />

</publications>

<dependencies defaultconf="release->default">

<dependency name="ant" rev="1.7.0" />

<dependency name="antlr" rev="2.7.6" />

<dependency name="xstream" rev="1.2.2" />

</dependencies>

</ivy-module>

仓库在文件系统上的结构, 可以由你自己决定, 只要在使用这个仓库时, 把它的布局信息用配置文件描述出来告诉使用者就可以了

如何使用这个仓库

基本上, 我们借助 Ant 来使用ivy, 那么我们需要告诉 Ant 一些repository相关的信息 : Where is the local repository, and How it looks like

<property name="ivy.local.default.root" location="/your/local/ivy/repository/folder" />

<ivy:settings id="ivy.instance" file="${ivy.local.default.root}/ivy.repository.settings.xml" />

那个ivy.repository.settings.xml就是来描述repository的布局的:

<ivysettings>

<settings defaultResolver="local" />

<resolvers>

<filesystem name="local" checkmodified="true">

<artifact pattern="${ivy.local.default.root}/[module]/[artifact].jar" />

<artifact pattern="${ivy.local.default.root}/[module]/[artifact]-[revision].jar" />

<ivy pattern="${ivy.local.default.root}/[module]/[module]-dependencies.xml" />

</filesystem>

</resolvers>

</ivysettings>

然后你告诉 Ant 你的项目的依赖和artifacts, Ant就可以帮你获得依赖和发布artifacts了

<property name="ivy.dep.file" location="${basedir}/my-module-dependencies.xml" />

<ivy:retrieve />

<!-- retrieve dependencies first, then compile, package, ... then publish-->

<ivy:publish resolver="local" pubrevision="1.0" overwrite="true" forcedeliver="true">

<artifacts pattern="${build.dir}/dist/[artifact].[ext]" />

<artifacts pattern="${basedir}/my-module-dependencies.xml" />

</ivy:publish>

那个my-module-dependencies.xml就是你的项目的依赖描述符, 事实上ivy也将它看作一个module,和repository里的module一视同仁. 参考最开始的例子.

Ivy 如何解决我们的问题

Q: 我的项目在开发环境和产品环境有不同的依赖, 怎么办?

A: Ivy 提供了"configuration" 的概念. 在那个my-module-dependencies.xml中, 你可以为你的module定义development和product两种配置, 可以指定每个artifact隶属于哪个配置, 指定每个dependency属于哪个配置. 注意这是一个递归定义, 因为你依赖的module也有可能定义了多个配置, 你需要指定你依赖于依赖的哪个配置,所以这是一个映射. 比如你的产品在运行环境中依赖于spring的产品环境:

<ivy-module version="1.0">

<info organisation="your.company" module="your.project" />

<configurations>

<conf name="product" />

<conf name="development" />

</configurations>

<dependencies defaultconf="product->default">

<dependency name="spring" rev="1.7.0" conf="release->product" />

<dependency name="antlr" rev="2.7.6" conf="development->debug" />

<dependency name="junit" rev="4.4" conf="development->release" />

</dependencies>

</ivy-module>

ivy 的各个Ant task允许你指定在哪个 configuration 上操作; 如为product配置取得所有依赖:

    <ivy:retrieve conf="product" />

Q: 我的项目在开发环境和产品环境有太多相同的依赖, 事实上开发环境包含产品环境所有的依赖, 额外再加上junit,jmock等; 如何消除重复的依赖描述呢?

A: Ivy 提供了配置之间 "extends" , 也就是"继承"的概念, 你可以让开发环境的配置继承自产品环境的配置, 这样就可以复用产品环境的配置

<configurations>

<conf name="product" />

<conf name="development" extends="product" />

</configurations>

Q: 缺省ivy总是从缓存中读取配置, 这样我的依赖配置更新后却得不到反映; 怎么禁止从cache中读取配置?

A: <filesystem name="local" checkmodified="true">


只有注册用户登录后才能发表评论。


网站导航: