某些情況下,模組的中繼資料(Ivy 檔、Maven POM)與實際制品(JAR、WAR)分散在不同位置。雙重解析器正是為此設計:它組合兩個子解析器,第一個專責尋找模組描述檔,第二個專責下載制品。
dual/
├── settings/ivysettings.xml # 雙重解析器設定
├── repository/ # 本地存放 Ivy 描述檔
│ └── commons-httpclient-ivy-2.0.2.xml
└── project/ # 示範專案
├── ivy.xml
├── build.xml
└── src/example/Hello.java
<dependencies>
<dependency org="commons-httpclient" name="commons-httpclient" rev="2.0.2"/>
<dependency org="commons-lang" name="commons-lang" rev="2.0"/>
</dependencies>
<ivysettings>
<settings defaultResolver="dual-example"/>
<resolvers>
<dual name="dual-example">
<filesystem name="ivys">
<ivy pattern="${ivy.settings.dir}/../repository/[module]-ivy-[revision].xml"/>
</filesystem>
<ibiblio name="ibiblio" m2compatible="true" usepoms="false"/>
</dual>
</resolvers>
</ivysettings>
dual 解析器必須包含兩個子解析器,順序固定:第一個為 metadata 解析器,第二個為 artifact 解析器。filesystem):從本地 repository/ 讀取 Ivy 檔,命名模式為 [module]-ivy-[revision].xml。ibiblio):以 Maven 2 相容模式從 Central 下載 JAR,usepoms="false" 確保不嘗試讀取 POM(因 metadata 已由第一解析器提供)。進入 dual/project 執行 ant,解析日誌:
found [ commons-httpclient | commons-httpclient | 2.0.2 ] in ivys
found [ commons-httpclient | commons-logging | 1.0.4 ] in ibiblio
found [ commons-lang | commons-lang | 2.0 ] in ibiblio
commons-httpclient 的模組描述檔從本地 ivys 解析器找到。commons-logging 及另一額外依賴 commons-lang 的描述檔與制品均從 ibiblio 獲取。HttpClient 與 Commons Lang 運作正常。<ivy-module version="1.0">
<info organisation="commons-httpclient" module="commons-httpclient" revision="2.0.2" status="release"/>
<dependencies>
<dependency org="commons-logging" name="commons-logging" rev="1.0.4" conf="default"/>
</dependencies>
</ivy-module>
此檔案為原始 Maven POM 轉換而來,聲明了 commons-logging 依賴,使 Ivy 能正確解析傳遞依賴。
當你不想依賴 Maven Central 的中繼資料品質,或需為特定模組提供自訂的 Ivy 描述檔(如修正錯誤依賴、新增配置、調整衝突策略)時,雙重解析器讓你「以 Ivy 管 Ivy,以 Maven 取制品」,兼具靈活與效能。