現在你已經看到從一個已經存在的倉庫創建你自己的倉庫是如何的簡單,你可能會想知道如何處理更加復雜的情況,例如當源倉庫和目的地倉庫不遵循相同的命名約定。
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
然后你將看到結果倉庫比我們第一次構件的清晰了。
從我們的經驗來看,創建命名空間的花費是值得的,如果你經常需要在你自己的倉庫中,這里命名規則已經存在或者更加嚴格,為第三方類庫增加新的模塊或者修訂版本。