ivy教程(5)-雙重解析器
在一些情況下,會(huì)發(fā)生這樣的事情:你的模塊描述符(ivy文件,maven pom, ...)被放置在一個(gè)地方,而模塊的制品(jars,...)在另外一個(gè)地方。雙重解析器用于滿足這種類型的需求,而這個(gè)教程將展示如何使用它。
1) 項(xiàng)目描述
讓我們看一下你的ivy發(fā)行包里面的src/example/dual目錄.
它包含一個(gè)構(gòu)建文件和3個(gè)目錄:
* settings: b包含ivy設(shè)置文件
* repository: ivy文件的示例倉(cāng)庫(kù)
* project: 利用ivy雙重解析器的項(xiàng)目
1. dual項(xiàng)目
項(xiàng)目非常簡(jiǎn)單,只包含一個(gè)簡(jiǎn)單的類: example.Hello
它依賴兩個(gè)類庫(kù): Apache commons-lang 和 Apache commons-httpclient.
這里是項(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è)類
讓我們看一下ivy.xml文件:
<ivy-module version="1.0">
<info organisation="org.apache" module="hello-ivy"/>
<dependencies>
<dependency org="commons-httpclient" name="commons-httpclient" rev="2.0.2"/>
<dependency org="commons-lang" name="commons-lang" rev="2.0"/>
</dependencies>
</ivy-module>
<info organisation="org.apache" module="hello-ivy"/>
<dependencies>
<dependency org="commons-httpclient" name="commons-httpclient" rev="2.0.2"/>
<dependency org="commons-lang" name="commons-lang" rev="2.0"/>
</dependencies>
</ivy-module>
如你所見(jiàn),這里沒(méi)有任何特殊的東西...實(shí)際上,這就是ivy的原理: 保持ivy文件獨(dú)立于依賴解析的方式。
2. ivy設(shè)置
ivy設(shè)置在settings目錄中;它只包含一個(gè)文件: ivysettings.xml.
<ivysettings>
<settings defaultResolver="dual-example"/>
<resolvers>
<dual name="dual-example">
<filesystem name="ivys">
<ivy pattern="${ivy.settings.dir}/../repository/[module]-ivy-[revision].xml" />
</filesystem>
<ibiblio name="ibiblio" m2compatible="true" usepoms="false" />
</dual>
</resolvers>
</ivysettings>
<settings defaultResolver="dual-example"/>
<resolvers>
<dual name="dual-example">
<filesystem name="ivys">
<ivy pattern="${ivy.settings.dir}/../repository/[module]-ivy-[revision].xml" />
</filesystem>
<ibiblio name="ibiblio" m2compatible="true" usepoms="false" />
</dual>
</resolvers>
</ivysettings>
這里我們配置了一個(gè)解析器,默認(rèn)的,它是一個(gè)雙重解析器。這個(gè)雙重解析器有兩個(gè)子解析器:第一個(gè)被稱為是雙重解析器的"ivy"或"metadata"解析器,而第二個(gè)被稱為"artifact" 解析器。重要的是雙重解析器必須嚴(yán)格的擁有兩個(gè)遵循這個(gè)給定順序的解析器。
metadata解析器,這里是一個(gè)文件解析器,僅僅用于查找模塊的描述符,在這個(gè)案例中是ivy文件。這個(gè)解析器給出的設(shè)置闡述說(shuō)所有ivy文件都在同一個(gè)目錄中,命名形如[module]-ivy-[revision].xml.如果我們檢查倉(cāng)庫(kù)目錄,我們可以確認(rèn)它包含一個(gè)名為commons-httpclient-ivy-2.0.2.xml的文件。它滿足給定的模式并將因此被這個(gè)解析器找到。
artifact解析器就是一個(gè)ibiblio 解析器,配置為m2compatible 模式以便使用maven2倉(cāng)庫(kù),屬性 usepoms="false" 確保它不會(huì)使用maven2 metadata。注意,這并不是嚴(yán)格要求,因?yàn)樵陔p重解析器中的第二個(gè)解析器(artifact解析器)本來(lái)就不會(huì)被要求查找模塊metadata。
2) walkthrough
step 1 : 準(zhǔn)備
打開(kāi)一個(gè)dos或者shell窗口,并進(jìn)去"dual"目錄
step 2 : 清理
在提示符下: ant
這將清理整個(gè)項(xiàng)目目錄樹(已編譯的類和獲得的libs)和ivy緩存。
你可以再每次你想清理這個(gè)例子時(shí)做這個(gè)事情。
step 3 : 運(yùn)行項(xiàng)目
進(jìn)入projuect目錄,并簡(jiǎn)單運(yùn)行ant
I:\dual\project>ant
Buildfile: src\example\dual\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\dual\config\ivysettings.xml
[ivy:retrieve] :: resolving dependencies :: [ org.apache | hello-ivy | working@BEN-ScokartG ]
[ivy:retrieve] confs: [default]
[ivy:retrieve] found [ commons-httpclient | commons-httpclient | 2.0.2 ] in ivys
[ivy:retrieve] found [ commons-httpclient | commons-logging | 1.0.4 ] in ibiblio
[ivy:retrieve] found [ commons-lang | commons-lang | 2.0 ] in ibiblio
[ivy:retrieve] downloading http://www.ibiblio.org/maven/commons-httpclient/jars/commons-httpclient-2.0.2.jar ...
[ivy:retrieve] ........................................................
[ivy:retrieve] ........................................................
[ivy:retrieve] ............ (220kB)
[ivy:retrieve] .. (0kB)
[ivy:retrieve] [SUCCESSFUL ] [ commons-httpclient | commons-httpclient | 2.0.2 ]/commons-httpclient.jar[jar] (11676ms)
[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] (7651ms)
[ivy:retrieve] downloading http://www.ibiblio.org/maven/commons-logging/jars/commons-logging-1.0.4.jar ...
[ivy:retrieve] ............................ (37kB)
[ivy:retrieve] .. (0kB)
[ivy:retrieve] [SUCCESSFUL ] [ commons-httpclient | commons-logging | 1.0.4 ]/commons-logging.jar[jar] (9724ms)
[ivy:retrieve] :: resolution report ::
---------------------------------------------------------------------
| | modules || artifacts |
| conf | number| search|dwnlded|evicted|| number|dwnlded|
---------------------------------------------------------------------
| default | 3 | 3 | 0 | 0 || 3 | 3 |
---------------------------------------------------------------------
[ivy:retrieve] :: retrieving :: [ org.apache | hello-ivy ]
[ivy:retrieve] confs: [default]
[ivy:retrieve] 3 artifacts copied, 0 already retrieved
run:
[mkdir] Created dir: C:\dev\data\opensource_workspace\ivy\src\example\dual\project\build
[javac] Compiling 1 source file to C:\dev\data\opensource_workspace\ivy\src\example\dual\project\build
[java] standard message : hello ivy !
[java] capitalized by org.apache.commons.lang.WordUtils : Hello Ivy !
[java] head status code with httpclient: 200
[java] now check if httpclient dependency on commons-logging has been realized
[java] found logging class in classpath: interface org.apache.commons.logging.Log
BUILD SUCCESSFUL
Total time: 37 seconds
Buildfile: src\example\dual\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\dual\config\ivysettings.xml
[ivy:retrieve] :: resolving dependencies :: [ org.apache | hello-ivy | working@BEN-ScokartG ]
[ivy:retrieve] confs: [default]
[ivy:retrieve] found [ commons-httpclient | commons-httpclient | 2.0.2 ] in ivys
[ivy:retrieve] found [ commons-httpclient | commons-logging | 1.0.4 ] in ibiblio
[ivy:retrieve] found [ commons-lang | commons-lang | 2.0 ] in ibiblio
[ivy:retrieve] downloading http://www.ibiblio.org/maven/commons-httpclient/jars/commons-httpclient-2.0.2.jar ...
[ivy:retrieve] ........................................................
[ivy:retrieve] ........................................................
[ivy:retrieve] ............ (220kB)
[ivy:retrieve] .. (0kB)
[ivy:retrieve] [SUCCESSFUL ] [ commons-httpclient | commons-httpclient | 2.0.2 ]/commons-httpclient.jar[jar] (11676ms)
[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] (7651ms)
[ivy:retrieve] downloading http://www.ibiblio.org/maven/commons-logging/jars/commons-logging-1.0.4.jar ...
[ivy:retrieve] ............................ (37kB)
[ivy:retrieve] .. (0kB)
[ivy:retrieve] [SUCCESSFUL ] [ commons-httpclient | commons-logging | 1.0.4 ]/commons-logging.jar[jar] (9724ms)
[ivy:retrieve] :: resolution report ::
---------------------------------------------------------------------
| | modules || artifacts |
| conf | number| search|dwnlded|evicted|| number|dwnlded|
---------------------------------------------------------------------
| default | 3 | 3 | 0 | 0 || 3 | 3 |
---------------------------------------------------------------------
[ivy:retrieve] :: retrieving :: [ org.apache | hello-ivy ]
[ivy:retrieve] confs: [default]
[ivy:retrieve] 3 artifacts copied, 0 already retrieved
run:
[mkdir] Created dir: C:\dev\data\opensource_workspace\ivy\src\example\dual\project\build
[javac] Compiling 1 source file to C:\dev\data\opensource_workspace\ivy\src\example\dual\project\build
[java] standard message : hello ivy !
[java] capitalized by org.apache.commons.lang.WordUtils : Hello Ivy !
[java] head status code with httpclient: 200
[java] now check if httpclient dependency on commons-logging has been realized
[java] found logging class in classpath: interface org.apache.commons.logging.Log
BUILD SUCCESSFUL
Total time: 37 seconds
你可以看到,ivy不僅僅下載commons-lang 和commons-httpclient,而且還有commons-logging.實(shí)際上,commons-logging是httpclient的依賴,我們可以看到在倉(cāng)庫(kù)目錄中找到的httpclient 的ivy文件.
<ivy-module version="1.0">
<info
organisation="commons-httpclient"
module="commons-httpclient"
revision="2.0.2"
status="release"
publication="20041010174300"/>
<dependencies>
<dependency org="commons-logging" name="commons-logging" rev="1.0.4" conf="default"/>
</dependencies>
</ivy-module>
<info
organisation="commons-httpclient"
module="commons-httpclient"
revision="2.0.2"
status="release"
publication="20041010174300"/>
<dependencies>
<dependency org="commons-logging" name="commons-logging" rev="1.0.4" conf="default"/>
</dependencies>
</ivy-module>
想這樣每個(gè)東西都工作的很好,ivy文件在倉(cāng)庫(kù)目錄下被找到而制品從ibiblio下載。
這種類型的配置在你不想依賴maven2倉(cāng)庫(kù)的metadata或者你想為一些或者全部模塊完全利用ivy文件時(shí)有用。
有關(guān)雙重解析器的完整的解析,請(qǐng)查閱對(duì)應(yīng)的參考文檔。
posted on 2009-09-27 20:58 sky ao 閱讀(1777) 評(píng)論(0) 編輯 收藏 所屬分類: project building