從公共倉庫(如 Maven Central、Ibiblio)同步成品到私有倉庫時,常面臨命名不一致問題:
commons-lang vs org.apache.commons)com.mycorp)Ivy 的 Namespace 機制 以正則表達式定義雙向轉換規則,解析時將倉庫命名空間映射為系統命名空間,發布時反向映射,實現「一次定義,雙向一致」。
ivysettings-advanced.xml<ivysettings>
<settings defaultResolver="my-repo"/>
<resolvers>
<ibiblio name="libraries" root="https://repo1.maven.org/maven2/" m2compatible="true"
namespace="maven2"/> <!-- 關鍵:指定 namespace -->
<filesystem name="my-repo">
<artifact pattern="${ivy.settings.dir}/myrepository/advanced/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"/>
<ivy pattern="${ivy.settings.dir}/myrepository/advanced/[organisation]/[module]/[revision]/ivy-[revision].xml"/>
</filesystem>
</resolvers>
<namespaces>
<namespace name="maven2">
<rule>
<!-- fromsystem:系統 → 倉庫(解析時) -->
<fromsystem>
<src organisation="apache" module=".+"/>
<dest organisation="$m0" module="$m0"/> <!-- apache#commons-lang → commons-lang#commons-lang -->
</fromsystem>
<!-- tosystem:倉庫 → 系統(安裝/發布時) -->
<tosystem>
<src organisation="commons-.+" module="commons-.+"/>
<src organisation="ant.*" module="ant.*"/>
<src organisation="xmlrpc" module="xmlrpc"/>
<dest organisation="apache" module="$m0"/> <!-- 統一轉為 apache#模組 -->
</tosystem>
</rule>
</namespace>
</namespaces>
</ivysettings>
ant maven2-namespace
# 或
ant maven2-namespace-deps # 含相依傳遞
輸出示範:
[ivy:install] :: installing apache#commons-lang;1.0
[ivy:install] published commons-lang to .../myrepository/advanced/apache/commons-lang/jars/commons-lang-1.0.jar
[ivy:install] published ivy to .../myrepository/advanced/apache/commons-lang/ivys/ivy-1.0.xml
目錄結構:
myrepository/advanced/apache/commons-lang/
├── jars/commons-lang-1.0.jar
└── ivys/ivy-1.0.xml
ivy-1.0.xml 關鍵中繼資料:
<info organisation="apache" module="commons-lang" revision="1.0"
status="integration" publication="20051124062021" namespace="ibiblio-maven2"/>
組織 ID 已統一為 apache,且保留 namespace 屬性記錄來源。
| 前綴 | 含義 | 範例 |
|---|---|---|
$o0 | 組織完整匹配值 | org="apache" → $o0 = "apache" |
$o1 | 組織第 1 個捕獲群組 | org="commons-(.+)" → $o1 = "lang" |
$m0 | 模組完整匹配值 | 同上 |
$r0 | 版本完整匹配值 | 同上 |