在這個(gè)例子中,我們將看到使用ivy的一個(gè)最簡單的方式。不使用任何特殊設(shè)置,ivy將使用maven2 倉庫來解析你在ivy文件中聲明的依賴。讓我們來看一眼涉及到的文件的內(nèi)容。
你將在ivy發(fā)行包的src/example/hello-ivy 目錄下找到這個(gè)教程的源文件。
1) ivy.xml 文件
這個(gè)文件用于描述項(xiàng)目對其他類庫的依賴。
這里是例子
<ivy-module version="2.0">
<info organisation="apache" module="hello-ivy"/>
<dependencies>
<dependency org="commons-lang" name="commons-lang" rev="2.0"/>
<dependency org="commons-cli" name="commons-cli" rev="1.0"/>
</dependencies>
</ivy-module>
這個(gè)文件的格式非常容易理解,但是讓我們給出一些關(guān)于這里聲明的東西的細(xì)節(jié)。首先,根元素ivy-module,version屬性用于告訴ivy這個(gè)文件使用的ivy的版本。
然后是info標(biāo)簽,用于給出和這個(gè)我們正在定義依賴的模塊有關(guān)的信息。這里只定義了組織和模塊名,你可以自由選擇任何你想要的組織和模塊名,但是我們建議不要帶空格。
最后,dependencies 部分讓你定義依賴。這里這個(gè)模塊依賴兩個(gè)類庫:commons-lang 和 commons-cli。如你所看到的,我們使用org和name屬性來定義我們需要的依賴的組織和模塊名。rev屬性用于明確說明你依賴的模塊的修訂版本。
為了知道如何填寫這些屬性,你需要知道你依賴的類庫的準(zhǔn)確信息。ivy默認(rèn)使用maven2 倉庫。我們推薦你使用mvnrepository.com 來查找你需要的模塊。一旦你找到它,你將得到如何在一個(gè)maven POM中聲明依賴的細(xì)節(jié)。例如:
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.0</version>
</dependency>
為了將這些信息轉(zhuǎn)換為ivy依賴聲明,你所需要做的只是使用groupId 作為組織,artifactId作為模塊名。這是我們在這個(gè)教程中為依賴做的,commons-lang 和 commons-cli。注意使用commons-lang 和 commons-cli 作為組織不是組織應(yīng)該是什么的最好的例子。更好的方式是使用org.apache, org.apache.commons 或 org.apache.commons.lang. 然而,這是在maven2倉庫中如何標(biāo)識這些模塊的方法,因此獲得他們的最簡單的方式是照原來的樣子使用細(xì)節(jié)(你將會看到在
構(gòu)建一個(gè)倉庫時(shí),你可以使用命名空間來重新定義這些名稱,如果你想讓某些東西更加清晰)。
如果你想得到在ivy文件中可以做什么的更多細(xì)節(jié),你可以看一下ivy文件的參考文檔。
2) build.xml 文件
對應(yīng)的build文件包含一個(gè)target集合,容許解析在ivy文件中聲明的依賴,編譯并運(yùn)行示例代碼,生成依賴解析報(bào)告,并清理項(xiàng)目的緩存。
你可以使用標(biāo)準(zhǔn)的"ant -p" 來獲取可用的target列表。可以隨意看一下整個(gè)文件,這里是和依賴解析有關(guān)的部分:
<project xmlns:ivy="antlib:org.apache.ivy.ant" name="hello-ivy" default="run">

<!-- =================================
target: resolve
================================= -->
<target name="resolve" description="--> retrieve dependencies with ivy">
<ivy:retrieve />
</target>
</project>
如你所見,調(diào)用ivy來解析和獲取依賴是非常簡單的:如果ivy安裝正確,你所需要做的只是在你的ant文件中定義一個(gè)xml的命名空間(xmlns:ivy="antlib:org.apache.ivy.ant")。然后在這里命名空間中所有的ivy ant 任務(wù)都可用。
這里我們只使用了一個(gè)任務(wù):retrieve 任務(wù)。沒有任何屬性,它將使用默認(rèn)設(shè)置并查找名為ivy.xml的文件來獲取依賴定義。這正是我們想要的,因此我們不需要做其他。
注意,在這案例中我們定義了一個(gè)"resolve" target 并調(diào)用了retrieve 任務(wù)。這聽起來有點(diǎn)令人困惑,實(shí)際上retrieve任務(wù)會執(zhí)行一次resolve(解析依賴并下載他們到本地緩存),然后再執(zhí)行一次retrieve。查看
How does it work ? 頁面來得到關(guān)于這個(gè)的更多細(xì)節(jié)。
3) 運(yùn)行項(xiàng)目
好,現(xiàn)在我們看到文件已經(jīng)解析好了,讓我們運(yùn)行這個(gè)實(shí)例來看會發(fā)生什么。打開一個(gè)shell(或者命令行)窗口,并進(jìn)入hello-ivy 實(shí)例目錄。然后,在命令提示符下,運(yùn)行"ant":
I:\hello-ivy>ant
Buildfile: src\example\hello-ivy\build.xml
resolve:
[ivy:retrieve] :: Ivy 2.0.0-beta1-local-20071104204849 - 20071104204849 :: http://ant.apache.org/ivy/ ::
[ivy:retrieve] No ivy:settings found for the default reference 'ivy.instance'. A default instance will be used
[ivy:retrieve] no settings file found, using default....
[ivy:retrieve] :: loading settings :: url = jar:file:/c:/dev/data/opensource_workspace/ivy/build/artifact/ivy-core.jar!/org/apache/ivy/core/settings/ivysettings.xml
[ivy:retrieve] :: resolving dependencies :: [ org.apache | hello-ivy | working@BEN-ScokartG ]
[ivy:retrieve] confs: [default]
[ivy:retrieve] found [ commons-lang | commons-lang | 2.0 ] in public
[ivy:retrieve] found [ commons-cli | commons-cli | 1.0 ] in public
[ivy:retrieve] found [ commons-logging | commons-logging | 1.0 ] in public
[ivy:retrieve] downloading http://repo1.maven.org/maven2/commons-lang/commons-lang/2.0/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] (3335ms)
[ivy:retrieve] downloading http://repo1.maven.org/maven2/commons-cli/commons-cli/1.0/commons-cli-1.0.jar ....
[ivy:retrieve] .................................... (29kB)
[ivy:retrieve] .. (0kB)
[ivy:retrieve] [SUCCESSFUL ] [ commons-cli | commons-cli | 1.0 ]/commons-cli.jar[jar] (2053ms)
[ivy:retrieve] downloading http://repo1.maven.org/maven2/commons-logging/commons-logging/1.0/commons-logging-1.0.jar ....
[ivy:retrieve] .......... (21kB)
[ivy:retrieve] .. (0kB)
[ivy:retrieve] [SUCCESSFUL ] [ commons-logging | commons-logging | 1.0 ]/commons-logging.jar[jar] (1933ms)
[ivy:retrieve] :: resolution report ::
[ivy:retrieve] :: evicted modules:
[ivy:retrieve] [ commons-lang | commons-lang | 1.0 ] by [[ commons-lang | commons-lang | 2.0 ]] in [default]
---------------------------------------------------------------------
| | modules || artifacts |
| conf | number| search|dwnlded|evicted|| number|dwnlded|
---------------------------------------------------------------------
| default | 4 | 3 | 0 | 1 || 3 | 3 |
---------------------------------------------------------------------
[ivy:retrieve] :: retrieving :: [ org.apache | hello-ivy ]
[ivy:retrieve] confs: [default]
[ivy:retrieve] 3 artifacts copied, 0 already retrieved
run:
[java] standard message : hello ivy !
[java] capitalized by org.apache.commons.lang.WordUtils : Hello Ivy !
BUILD SUCCESSFUL
Total time: 14 seconds
4) 發(fā)生了什么?
在沒有任何設(shè)置的情況下,ivy從maven2 倉庫中獲取文件。這就是這里發(fā)生的事情。
resolve任務(wù)在maven2 倉庫中發(fā)現(xiàn)commons-lang 和 commons-cli 模塊,識別commons-cli 依賴于commons-logging并作為間接依賴解析它。然后ivy下載所有對應(yīng)的制品到它的緩存中(默認(rèn)在你的user home下的.ivy2/cache 目錄)。
最后,retrieve任務(wù)將這些解析好的jar包從ivy緩存復(fù)制到項(xiàng)目默認(rèn)的lib目錄(你可以簡單地通過設(shè)置retrieve任務(wù)的pattern屬性來改變).
你可能會發(fā)現(xiàn)這個(gè)任務(wù)僅僅為輸出一個(gè)"Hello Ivy !"信息就花費(fèi)了很長的時(shí)間。但是記住大量的時(shí)間用在從網(wǎng)絡(luò)下載需要的文件。讓我們再次運(yùn)行它:
I:\hello-ivy>ant
Buildfile: src\example\hello-ivy\build.xml
resolve:
[ivy:retrieve] :: Ivy 2.0.0-beta1-local-20071104204849 - 20071104204849 :: http://ant.apache.org/ivy/ ::
[ivy:retrieve] No ivy:settings found for the default reference 'ivy.instance'. A default instance will be used
[ivy:retrieve] no settings file found, using default...
[ivy:retrieve] :: loading settings :: url = jar:file:/c:/dev/data/opensource_workspace/ivy/build/artifact/ivy-core.jar!/org/apache/ivy/core/settings/ivysettings.xml
[ivy:retrieve] :: resolving dependencies :: [ org.apache | hello-ivy | working@BEN-ScokartG ]
[ivy:retrieve] confs: [default]
[ivy:retrieve] found [ commons-lang | commons-lang | 2.0 ] in public
[ivy:retrieve] found [ commons-cli | commons-cli | 1.0 ] in public
[ivy:retrieve] found [ commons-logging | commons-logging | 1.0 ] in public
[ivy:retrieve] :: resolution report ::
[ivy:retrieve] :: evicted modules:
[ivy:retrieve] [ commons-lang | commons-lang | 1.0 ] by [[ commons-lang | commons-lang | 2.0 ]] in [default]
---------------------------------------------------------------------
| | modules || artifacts |
| conf | number| search|dwnlded|evicted|| number|dwnlded|
---------------------------------------------------------------------
| default | 4 | 0 | 0 | 1 || 3 | 0 |
---------------------------------------------------------------------
[ivy:retrieve] :: retrieving :: [ org.apache | hello-ivy ]
[ivy:retrieve] confs: [default]
[ivy:retrieve] 0 artifacts copied, 3 already retrieved
run:
[java] standard message : hello ivy !
[java] capitalized by org.apache.commons.lang.WordUtils : Hello Ivy !
BUILD SUCCESSFUL
Total time: 3 seconds
太好了!緩存被使用,不再需要下載,構(gòu)建只在瞬間。
現(xiàn)在,如果你想生成一個(gè)泥的模塊的所有依賴的詳細(xì)報(bào)告,你可以調(diào)用report target,并查看在build目錄中的生成文件。你將得到一些類似這樣的東西。
如你所見,使用ivy來解析存儲在maven2 倉庫中的依賴是非常容易的。現(xiàn)在你可以繼續(xù)下一個(gè)教程來學(xué)習(xí)更多的關(guān)于
如何使用模塊配置的內(nèi)容,這是一個(gè)非常強(qiáng)大的ivy特殊特性。其他教程也可用,你將學(xué)習(xí)到如何使用ivy設(shè)置來建造一個(gè)可能非常復(fù)雜的企業(yè)倉庫。現(xiàn)在也是開始閱讀
參考文檔的好時(shí)機(jī),尤其是介紹題材可以很好的給出ivy概況。對于開始考慮如何使用ant + ivy來構(gòu)建一個(gè)干凈而健壯的構(gòu)建系統(tǒng)來說,
最佳實(shí)踐頁面是必須閱讀的。