Posted on 2007-12-23 23:22
切尔斯基 阅读(5920)
评论(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">