現在你已經看到從一個已經存在的倉庫創建你自己的倉庫是如何的簡單,你可能會想知道如何處理更 加復雜的情況,例如當源倉庫和目的地倉庫不遵循相同的命名約定。
1) 通往專業倉庫之路
我們將學習這個如何構建一個專業倉庫的章節。什麼是專業倉庫?我們的觀點是一個良好質量的倉庫 必須遵循有關項目命名的清晰的規則,並必須提供正確,可用,可配置和驗證過的項目描述符。為了達到 這些目標,我們認為你必須構建你自己的倉庫。
在前面的例子裡面我們已經看到,我們可以使用一些公共倉庫看來開始構建我們自己的倉庫。然而, 結果並不總是那麼理想, 尤其是關系到使用的命名規則。
當你有一個已經存在的倉庫並且希望從大量的不遵循相同的命名轉換的公共倉庫中獲益時,這個問題 非常常見。或者僅僅是因為你發現你作為基礎使用的倉庫不夠一直- 為什麼所有的apache commons模塊不 適用org.apache.commons 組織? 歷史原因。但是如果你安裝你自己的倉庫,你可能不想從歷史中蒙受損 失。
幸運的是,對於這種問題ivy有一種非常強大的答復:namespaces.
2) 使用命名空間
當你查看前面教程構建的倉庫時,你將清晰的看到我們正在談論的東西:所有 apache commons模塊使用它們自己的名字作為組織。
因此讓我們看一下通過使用namespaces ivy可以做什麼(稍後我們將深入細節):
Z:\>ant commons-lang-1-0-ibiblio-with-namespace Buildfile: build.xml load-ivy: init-ivy: maven2-namespace: [ivy:install] :: loading settings :: url = jar:file://home/xavier/.ivy2/jars/ivy.jar!/org/apache/ivy/core/settings/ivysettings.xml [ivy:install] :: Ivy 2.0.0-beta1-local-20071130005044 - 20071130005044 :: http://ant.apache.org/ivy/ :: :: loading settings :: file = /home/xavier/ivy/settings/ivysettings-advanced.xml [ivy:install] :: installing apache#commons-lang;1.0 :: [ivy:install] :: resolving dependencies :: [ivy:install] found apache#commons-lang;1.0 in libraries [ivy:install] :: downloading artifacts to cache :: [ivy:install] downloading http://repo1.maven.org/maven2/commons-lang/commons- lang/1.0/commons-lang-1.0.jar ... [ivy:install] ........ (62kB) [ivy:install] .. (0kB) [ivy:install] [SUCCESSFUL ] apache#commons-lang;1.0/commons-lang.jar[jar] (1612ms) [ivy:install] :: installing in my-repository :: [ivy:install] published commons-lang to /home/xavier/ivy/myrepository/advanced/apache/commons-lang/jars/commons-lang-1.0.jar [ivy:install] published ivy to /home/xavier/ivy/myrepository/advanced/apache/commons- lang/ivys/ivy-1.0.xml [ivy:install] :: install resolution report :: --------------------------------------------------------------------- | | modules || artifacts | | conf | number| search|dwnlded|evicted|| number|dwnlded| --------------------------------------------------------------------- | default | 1 | 1 | 0 | 0 || 1 | 1 | --------------------------------------------------------------------- BUILD SUCCESSFUL Total time: 3 seconds
現在我們看一下我們的倉庫,它看上去很好。
Z:\>dir /s /B /A:-D myrepository\advanced
Z:\myrepository\advanced\apache\commons-lang\ivys\ivy-1.0.xml
Z:\myrepository\advanced\apache\commons-lang\ivys\ivy-1.0.xml.md5
Z:\myrepository\advanced\apache\commons-lang\ivys\ivy-1.0.xml.sha1
Z:\myrepository\advanced\apache\commons-lang\jars\commons-lang-1.0.jar
Z:\myrepository\advanced\apache\commons-lang\jars\commons-lang-1.0.jar.md5
Z:\myrepository\advanced\apache\commons-lang\jars\commons-lang-1.0.jar.sha1
我們甚至可以看一下我們倉庫中的commons-lang ivy文件:
<?xml version="1.0" encoding="UTF-8"?>
<ivy-module version="1.0">
<info organisation="apache"
module="commons-lang"
revision="1.0"
status="integration"
publication="20051124062021"
namespace="ibiblio-maven2"
/>
......
很好,我們看到組織現在是'apache'。但是ivy是從哪裡獲得這個的呢?
1. 這是如何工作的?
實際上ivy和以往一樣使用同樣的倉庫作為源倉庫,僅僅有一點不同:namespace參數。
<ibiblio name="libraries"
root="${ibiblio-maven2-root}"
m2compatible="true"
namespace="maven2"
/>
namespace由一系列規則定義而成。這些規則基於正則表達式,並告訴ivy如何從倉 庫命名空間轉換數據到系統命名空間,換言之,ivy時常運行的命名空間(例如ivy 緩存通常使用系統命名 空間).
對於我們調用maven2的命名空間,我們已經定義了一些規則,這裡是一個:
處理導入apache maven1項目的規則
<rule> <!-- imported apache maven1 projects -->
<fromsystem>
<src org="apache" module=".+"/>
<dest org="$m0" module="$m0"/>
</fromsystem>
<tosystem>
<src org="commons-.+" module="commons-.+" />
<src org="ant.*" module="ant.*" />
...
<src org="xmlrpc" module="xmlrpc" />
<dest org="apache" module="$m0"/>
</tosystem>
</rule>
理解命名空間:
(1) fromsystem : 在這裡我們定義,在系統命名空間中以組織"apache"定義的項目被轉換 為目的地命名空間中使用模塊名為組織的項目,無論修訂版本是什麼.例如,系統命名空間中的項目 apache#commons-lang;1.0獎被轉換為maven2解析器命名空間中的commons-lang#commons-lang;1.0。
(2) tosystem : 在這裡我們定義反向映射,換言之從maven2倉庫轉換apache項目到系統命名空間的 apache項目。這裡使用的規則告訴說所有組織名匹配commons-.+ (把它看成java正則表達式)項目被轉換 為組織是apache而模塊名還是原來的項目。同樣的規則被使用到其他apache項目例如ant等等。
注意正則表達式的用法:為了識別在組織,模塊和修訂版本中找到的正則表達式, 使用的表示法用字 母'o', 'm' 和'r'作為匹配的正則表達式的前綴。
$o0 : 在組織屬性中完全匹配的值
$o1 : 在組織 屬性中標記的第一個匹配的語法分組
...
同樣應用在模塊中: $m0, $m1, ...
也用於修訂版本 : $r0, $r1, ...
好了,現在你知道命名空間背後的想法了,現在你可以檢查例子中提供的整個命名空間的設置,並使 用命名空間測試模塊和它的依賴的安裝。
運行
ant maven2-namespace-deps
然後你將看到結果倉庫比我們第一次構件的清晰了。
從我們的經驗來看,創建命名空間的花費是值得的,如果你經常需要在你自己的倉庫中,這裡命名規 則已經存在或者更加嚴格,為第三方類庫增加新的模塊或者修訂版本。