在這個例子中,我們將看到使用ivy的一個最簡單的方式。不使用任何特殊設置,ivy將使用maven2 倉 庫來解析你在ivy文件中聲明的依賴。讓我們來看一眼涉及到的文件的內容。
你將在ivy發行包的src/example/hello-ivy 目錄下找到這個教程的源文件。
1) ivy.xml 文件
這個文件用於描述項目對其他類庫的依賴。
這裡是例子
<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>
這個文件的格式非常容易理解,但是讓我們給出一些關於這裡聲明的東西的細節。首先,根元素ivy- module,version屬性用於告訴ivy這個文件使用的ivy的版本。
然後是info標簽,用於給出和這個我們正在定義依賴的模塊有關的信息。這裡只定義了組織和模塊名 ,你可以自由選擇任何你想要的組織和模塊名,但是我們建議不要帶空格。
最後,dependencies 部分讓你定義依賴。這裡這個模塊依賴兩個類庫:commons-lang 和 commons- cli。如你所看到的,我們使用org和name屬性來定義我們需要的依賴的組織和模塊名。rev屬性用於明確 說明你依賴的模塊的修訂版本。
為了知道如何填寫這些屬性,你需要知道你依賴的類庫的准確信息。ivy默認使用maven2 倉庫。我們 推薦你使用mvnrepository.com 來查找你需要的模塊。一旦你找到它,你將得到如何在一個maven POM中 聲明依賴的細節。例如:
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.0</version>
</dependency>
為了將這些信息轉換為ivy依賴聲明,你所需要做的只是使用groupId 作為組織,artifactId作為模塊 名。這是我們在這個教程中為依賴做的,commons-lang 和 commons-cli。注意使用commons-lang 和 commons-cli 作為組織不是組織應該是什麼的最好的例子。更好的方式是使用org.apache, org.apache.commons 或 org.apache.commons.lang. 然而,這是在maven2倉庫中如何標識這些模塊的方 法,因此獲得他們的最簡單的方式是照原來的樣子使用細節(你將會看到在構建一個倉庫時,你可以使用 命名空間來重新定義這些名稱,如果你想讓某些東西更加清晰)。
如果你想得到在ivy文件中可以做什麼的更多細節,你可以看一下ivy文件的參考文檔。
2) build.xml 文件
對應的build文件包含一個target集合,容許解析在ivy文件中聲明的依賴,編譯並運行示例代碼,生 成依賴解析報告,並清理項目的緩存。
你可以使用標准的"ant -p" 來獲取可用的target列表。可以隨意看一下整個文件,這裡是和依賴解析 有關的部分:
<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>
如你所見,調用ivy來解析和獲取依賴是非常簡單的:如果ivy安裝正確,你所需要做的只是在你的ant 文件中定義一個xml的命名空間 (xmlns:ivy="antlib:org.apache.ivy.ant")。然後在這裡命名空間中所 有的ivy ant 任務都可用。
這裡我們只使用了一個任務:retrieve 任務。沒有任何屬性,它將使用默認設置並查找名為ivy.xml 的文件來獲取依賴定義。這正是我們想要的,因此我們不需要做其他。
注意,在這案例中我們定義了一個"resolve" target 並調用了retrieve 任務。這聽起來有點令人困 惑,實際上retrieve任務會執行一次resolve(解析依賴並下載他們到本地緩存),然後再執行一次 retrieve。查看How does it work ? 頁面來得到關於這個的更多細節。
3) 運行項目
好,現在我們看到文件已經解析好了,讓我們運行這個實例來看會發生什麼。打開一個shell(或者命 令行)窗口,並進入hello-ivy 實例目錄。然後,在命令提示符下,運行"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) 發生了什麼?
在沒有任何設置的情況下,ivy從maven2 倉庫中獲取文件。這就是這裡發生的事情。
resolve任務在maven2 倉庫中發現commons-lang 和 commons-cli 模塊,識別commons-cli 依賴於 commons-logging並作為間接依賴解析它。然後ivy下載所有對應的制品到它的緩存中(默認在你的user home下的.ivy2/cache 目錄)。
最後,retrieve任務將這些解析好的jar包從ivy緩存復制到項目默認的lib目錄(你可以簡單地通過設 置retrieve任務的pattern屬性來改變).
你可能會發現這個任務僅僅為輸出一個"Hello Ivy !"信息就花費了很長的時間。但是記住大量的時間 用在從網絡下載需要的文件。讓我們再次運行它:
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
太好了!緩存被使用,不再需要下載,構建只在瞬間。
現在,如果你想生成一個泥的模塊的所有依賴的詳細報告,你可以調用report target,並查看在 build目錄中的生成文件。你將得到一些類似這樣的東西。
如你所見,使用ivy來解析存儲在maven2 倉庫中的依賴是非常容易的。現在你可以繼續下一個教程來 學習更多的關於如何使用模塊配置的內容,這是一個非常強大的ivy特殊特性。其他教程也可用,你將學 習到如何使用ivy設置來建造一個可能非常復雜的企業倉庫。現在也是開始閱讀參考文檔的好時機,尤其 是介紹題材可以很好的給出ivy概況。對於開始考慮如何使用ant + ivy來構建一個干淨而健壯的構建系統 來說,最佳實踐頁面是必須閱讀的。