這個例子演示模塊是如何被多解析器獲得的。使用多解析器在很多情況下是非常有用的,這裡是一些 例子:
* 來自發行的單獨的集成構建
* 為第三方模塊使用公共倉庫並且為內部模塊使用私有倉庫
* 使用一個倉庫來存儲那些在無法管理的公共倉庫裡裡面的不清晰的模塊
* 使用本地倉庫來暴露在一個開發人員的位置上生成的構建
在ivy中,多解析器的使用是通過一個名為解析器鏈的復合解析器來支持的。
在我們的例子中,我們將簡單的展示如何使用兩個解析器,一個在本地倉庫而另一個使用maven2倉庫 。
1) 項目描述
1. 項目: chained-resolvers
項目非常簡單,只包含一個簡單的類: example.Hello.
它依賴兩個類庫:Apache commons-lang 和一個小的test類庫(源文件被包含在jar文件中).test類庫 被項目使用用於將字符串轉換為大寫,而commons-lang用來以大些書寫同樣的字符串。
這是項目的內容:
* build.xml: 項目的ant 構建文件
* ivy.xml: ivy項目文件
* src\example\Hello.java: 項目僅有的一個類
讓我們看一下ivy.xm文件:
<ivy-module version="1.0">
<info organisation="org.apache" module="chained-resolvers"/>
<dependencies>
<dependency org="commons-lang" name="commons-lang" rev="2.0"/>
<dependency name="test" rev="1.0"/>
</dependencies>
</ivy-module>
和我們期望的一樣,ivy文件聲明依賴於兩個項目使用的依賴:commons-lang 和 test.注意我們沒有 指定test依賴的組織,在這種情況下ivy假定為和聲明的模塊同樣的組織,換句話說,在這個案例中是 org.apache。
2. ivy設置
ivy設置在設置目錄中生成,它只包含一個文件: ivysettings.xml.
<ivysettings>
<settings defaultResolver="chain-example"/>
<resolvers>
<chain name="chain-example">
<filesystem name="libraries">
<artifact pattern="${ivy.settings.dir}/repository/[artifact]-[revision]. [ext]" />
</filesystem>
<ibiblio name="ibiblio" m2compatible="true" />
</chain>
</resolvers>
</ivysettings>
3. 設置標簽
這個標簽用一些參數初始化ivy.這裡只使用了一個,默認使用的解析器的名稱。
4. 解析器標簽
在這個標簽下,我們可以找到ivy將使用的解析器的描述。在我們的例子中,我們僅使用一個解析器, 稱為"chain-example",它非常特殊在於它定義了一個解析器列表(或言之鏈)。
放在在鏈中的解析器有:
* libraries : 這是一個文件解析器。這個解析器被配置為在包含ivysettings.xml文件的目錄下 的"repository"子目錄查找制品。
* ibiblio : 這個解析器很特殊。它查找ibiblio maven倉庫來獲取類庫。
就這樣,我們配置好了解析器鏈。
2) walkthrough
步驟 1: 准備
打開一個dos或者shell串口,並進入"chained-resolvers"目錄。
步驟 2: 清理目錄樹
在提示符下: ant
這將清理完整的項目目錄樹和ivy緩存。每次你想清理這個例子的時候你都可以這樣做。
在幾乎所有的例子中,我們提供clean target作為默認的target。既然大部分例子使用相同的ivy緩存 ,每次你調用這個target時你將清理這個ivy緩存。
清理ivy緩存通常你可以放心的做(除了性能外):它僅僅是緩存,所有的東西都可以從倉庫中再次獲得 。對於從maven2過來的人來說,這聽起來有點奇怪,但是記住在ivy中,緩存不是本地倉庫,東西被隔離 地保持干淨。
步驟 3: 運行項目
進入chainedresolvers-project目錄,並簡單運行ant。
I:\chained-resolvers\chainedresolvers-project>ant
Buildfile: src\example\chained-resolvers\chainedresolvers-project\build.xml
resolve:
[ivy:retrieve] :: Ivy 2.0.0-beta1-local-20071104204849 - 20071104204849 :: http://ant.apache.org/ivy/ ::
[ivy:retrieve] :: loading settings :: file = C:\dev\data\opensource_workspace\ivy\src\example\chained- resolvers\config\ivysettings.xml
[ivy:retrieve] :: resolving dependencies :: [ org.apache | chained-resolvers | working@BEN-ScokartG ]
[ivy:retrieve] confs: [default]
[ivy:retrieve] found [ commons-lang | commons-lang | 2.0 ] in ibiblio
[ivy:retrieve] found [ org.apache | test | 1.0 ] in libraries
[ivy:retrieve] downloading http://www.ibiblio.org/maven/commons-lang/jars/commons-lang- 2.0.jar...
[ivy:retrieve] .......................................................................................... ..
[ivy:retrieve] .......................................................................................... ..(165kB)
[ivy:retrieve] .. (0kB)
[ivy:retrieve] [SUCCESSFUL ] [ commons-lang | commons-lang | 2.0 ]/commons-lang.jar[jar] (5928ms)
[ivy:retrieve] downloading C:\dev\data\opensource_workspace\ivy\src\example\chained- resolvers\config\repository\test-1.0.jar...
[ivy:retrieve] .. (1kB)
[ivy:retrieve] [SUCCESSFUL ] [ org.apache | test | 1.0 ]/test.jar[jar] (10ms)
[ivy:retrieve] :: resolution report ::
---------------------------------------------------------------------
| | modules || artifacts |
| conf | number| search|dwnlded|evicted|| number|dwnlded|
---------------------------------------------------------------------
| default | 2 | 2 | 0 | 0 || 2 | 2 |
---------------------------------------------------------------------
[ivy:retrieve] :: retrieving :: [ org.apache | chained-resolvers ]
[ivy:retrieve] confs: [default]
[ivy:retrieve] 2 artifacts copied, 0 already retrieved
run:
[mkdir] Created dir: C:\dev\data\opensource_workspace\ivy\src\example\chained -resolvers\chainedresolvers-project\build
[javac] Compiling 1 source file to C:\dev\data\opensource_workspace\ivy\src\example\chained-resolvers\chainedresolvers- project\build
[java] standard message :example world !
[java] capitalized by org.apache.commons.lang.WordUtils : Example World !
[java] upperCased by test.StringUtils : EXAMPLE WORLD !
BUILD SUCCESSFUL
Total time: 12 seconds
我們能看到在resolve任務的日志中,兩個依賴被獲取(2個制品)並被復制到ivy緩存目錄(2個下載)。
run target成功地使用了來自ibiblio倉庫的commons-lang.jar和來自本地倉庫中的test.jar
3) 更進一步
這個非常簡單的例子有助於看到如何對在一個鏈中的兩個解析器進行基本的設置。對於那些想知道這 個解析器提供的所有特性的人,可以查看鏈解析器的參考文檔。
從這個基本的例子中尼可以得到的最有趣的事情是:
* 鏈並不局限於兩個內嵌解析器,你可以使用任何你想要的數目。
* 通過設置returnFirst="true",你可以得到一個一旦發現給定模塊就停止的鏈。
* 通過設置dual="true",整個完整的鏈將被用於模塊描述符和制品,而當dual="false",在鏈中找到 模塊描述符(如果有任何一個)的解析器將被用於查找制品。