這個(gè)例子演示模塊是如何被多解析器獲得的。使用多解析器在很多情況下是非常有用的,這里是一些例子:
* 來(lái)自發(fā)行的單獨(dú)的集成構(gòu)建
* 為第三方模塊使用公共倉(cāng)庫(kù)并且為內(nèi)部模塊使用私有倉(cāng)庫(kù)
* 使用一個(gè)倉(cāng)庫(kù)來(lái)存儲(chǔ)那些在無(wú)法管理的公共倉(cāng)庫(kù)里里面的不清晰的模塊
* 使用本地倉(cāng)庫(kù)來(lái)暴露在一個(gè)開(kāi)發(fā)人員的位置上生成的構(gòu)建
在ivy中,多解析器的使用是通過(guò)一個(gè)名為解析器鏈的復(fù)合解析器來(lái)支持的。
在我們的例子中,我們將簡(jiǎn)單的展示如何使用兩個(gè)解析器,一個(gè)在本地倉(cāng)庫(kù)而另一個(gè)使用maven2倉(cāng)庫(kù)。
1) 項(xiàng)目描述
1. 項(xiàng)目: chained-resolvers
項(xiàng)目非常簡(jiǎn)單,只包含一個(gè)簡(jiǎn)單的類(lèi): example.Hello.
它依賴兩個(gè)類(lèi)庫(kù):Apache commons-lang 和一個(gè)小的test類(lèi)庫(kù)(源文件被包含在jar文件中).test類(lèi)庫(kù)被項(xiàng)目使用用于將字符串轉(zhuǎn)換為大寫(xiě),而commons-lang用來(lái)以大些書(shū)寫(xiě)同樣的字符串。
這是項(xiàng)目的內(nèi)容:
* build.xml: 項(xiàng)目的ant 構(gòu)建文件
* ivy.xml: ivy項(xiàng)目文件
* src\example\Hello.java: 項(xiàng)目?jī)H有的一個(gè)類(lèi)
讓我們看一下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文件聲明依賴于兩個(gè)項(xiàng)目使用的依賴:commons-lang 和 test.注意我們沒(méi)有指定test依賴的組織,在這種情況下ivy假定為和聲明的模塊同樣的組織,換句話說(shuō),在這個(gè)案例中是org.apache。
2. ivy設(shè)置
ivy設(shè)置在設(shè)置目錄中生成,它只包含一個(gè)文件: 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. 設(shè)置標(biāo)簽
這個(gè)標(biāo)簽用一些參數(shù)初始化ivy.這里只使用了一個(gè),默認(rèn)使用的解析器的名稱(chēng)。
4. 解析器標(biāo)簽
在這個(gè)標(biāo)簽下,我們可以找到ivy將使用的解析器的描述。在我們的例子中,我們僅使用一個(gè)解析器,稱(chēng)為"chain-example",它非常特殊在于它定義了一個(gè)解析器列表(或言之鏈)。
放在在鏈中的解析器有:
* libraries : 這是一個(gè)文件解析器。這個(gè)解析器被配置為在包含ivysettings.xml文件的目錄下的"repository"子目錄查找制品。
* ibiblio : 這個(gè)解析器很特殊。它查找ibiblio maven倉(cāng)庫(kù)來(lái)獲取類(lèi)庫(kù)。
就這樣,我們配置好了解析器鏈。
2) walkthrough
步驟 1: 準(zhǔn)備
打開(kāi)一個(gè)dos或者shell串口,并進(jìn)入"chained-resolvers"目錄。
步驟 2: 清理目錄樹(shù)
在提示符下: ant
這將清理完整的項(xiàng)目目錄樹(shù)和ivy緩存。每次你想清理這個(gè)例子的時(shí)候你都可以這樣做。
在幾乎所有的例子中,我們提供clean target作為默認(rèn)的target。既然大部分例子使用相同的ivy緩存,每次你調(diào)用這個(gè)target時(shí)你將清理這個(gè)ivy緩存。
清理ivy緩存通常你可以放心的做(除了性能外):它僅僅是緩存,所有的東西都可以從倉(cāng)庫(kù)中再次獲得。對(duì)于從maven2過(guò)來(lái)的人來(lái)說(shuō),這聽(tīng)起來(lái)有點(diǎn)奇怪,但是記住在ivy中,緩存不是本地倉(cāng)庫(kù),東西被隔離地保持干凈。
步驟 3: 運(yùn)行項(xiàng)目
進(jìn)入chainedresolvers-project目錄,并簡(jiǎn)單運(yùn)行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任務(wù)的日志中,兩個(gè)依賴被獲取(2個(gè)制品)并被復(fù)制到ivy緩存目錄(2個(gè)下載)。
run target成功地使用了來(lái)自ibiblio倉(cāng)庫(kù)的commons-lang.jar和來(lái)自本地倉(cāng)庫(kù)中的test.jar
3) 更進(jìn)一步
這個(gè)非常簡(jiǎn)單的例子有助于看到如何對(duì)在一個(gè)鏈中的兩個(gè)解析器進(jìn)行基本的設(shè)置。對(duì)于那些想知道這個(gè)解析器提供的所有特性的人,可以查看鏈解析器的參考文檔。
從這個(gè)基本的例子中尼可以得到的最有趣的事情是:
* 鏈并不局限于兩個(gè)內(nèi)嵌解析器,你可以使用任何你想要的數(shù)目。
* 通過(guò)設(shè)置returnFirst="true",你可以得到一個(gè)一旦發(fā)現(xiàn)給定模塊就停止的鏈。
* 通過(guò)設(shè)置dual="true",整個(gè)完整的鏈將被用于模塊描述符和制品,而當(dāng)dual="false",在鏈中找到模塊描述符(如果有任何一個(gè))的解析器將被用于查找制品。