首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Ivy 教程 (10):建立儲存庫 (2) - 基礎儲存庫複製

     編輯:Java 相關知識

前言

在本教程中,我們將示範如何使用 Ivy 的 install 任務,從 Maven 2 儲存庫將模組安裝到一個基於檔案系統的本地儲存庫。我們會先安裝一個沒有依賴的簡單模組,隨後安裝一個帶有傳遞依賴的複雜模組,並觀察 Ivy 如何處理缺失的制品。

1. 基礎設定:ivysettings.xml

我們使用一個簡單的 Ivy 設定檔,定義兩個解析器:libraries 作為來源(指向 Maven Central),my-repository 作為目的地(本地檔案系統儲存庫)。這模擬了團隊內部維護私有儲存庫的典型場景。

<ivysettings>
  <settings defaultCache="${ivy.cache.dir}/no-namespace"
            defaultResolver="libraries"
            defaultConflictManager="all" />
  <!-- 為了獲取所有修訂版本而不進行排除 -->
  <resolvers>
    <ibiblio name="libraries" m2compatible="true" />
    <filesystem name="my-repository">
      <ivy pattern="${dest.repo.dir}/no-namespace/[organisation]/[module]/ivys/ivy-[revision].xml"/>
      <artifact pattern="${dest.repo.dir}/no-namespace/[organisation]/[module]/[type]s/[artifact]-[revision].[ext]"/>
    </filesystem>
  </resolvers>
</ivysettings>

2. 安裝無依賴的簡單模組

我們以 commons-lang:commons-lang:1.0 為例。Ant target 非常精簡,透過屬性引用解析器名稱,便於維護。

<target name="maven2" depends="init-ivy"
        description="--> install module from maven 2 repository">
  <ivy:install settingsRef="basic.settings"
               organisation="commons-lang" module="commons-lang" revision="1.0"
               from="${from.resolver}" to="${to.resolver}" />
</target>

執行結果分析

執行 ant maven2 後,日誌顯示:

  • Ivy 從 libraries 解析器找到模組定義。
  • 從 Maven Central 下載對應的 JAR 制品到快取。
  • 將模組發布到 my-repository(本地檔案系統)。

檢查本地儲存庫目錄,可以看到生成的結構:

myrepository/no-namespace/commons-lang/commons-lang/ivys/ivy-1.0.xml
myrepository/no-namespace/commons-lang/commons-lang/ivys/ivy-1.0.xml.md5
myrepository/no-namespace/commons-lang/commons-lang/ivys/ivy-1.0.xml.sha1
myrepository/no-namespace/commons-lang/commons-lang/jars/commons-lang-1.0.jar
myrepository/no-namespace/commons-lang/commons-lang/jars/commons-lang-1.0.jar.md5
myrepository/no-namespace/commons-lang/commons-lang/jars/commons-lang-1.0.jar.sha1

除了 JAR 檔,Ivy 還自動生成了 Ivy 格式的模組描述檔(ivy-1.0.xml)以及 MD5/SHA1 校驗和,確保後續解析時的完整性驗證。

3. 安裝帶有傳遞依賴的模組

接著我們嘗試安裝 org.hibernate:hibernate:3.2.5.ga,並啟用 transitive="true" 讓 Ivy 自動解析並安裝所有依賴。

<target name="maven2-deps" depends="init-ivy"
        description="--> install module from maven 2 repository with dependencies">
  <ivy:install settingsRef="basic.settings"
               organisation="org.hibernate" module="hibernate" revision="3.2.5.ga"
               from="${from.resolver}" to="${to.resolver}" transitive="true" />
</target>

執行過程與問題

執行 ant maven2-deps 時,Ivy 成功解析了 28 個模組,並下載了大部分制品。然而,建構最終以 BUILD FAILED 結束,日誌中出現:

[ivy:install] missing artifact javax.transaction#jta;1.0.1B/jta.jar[jar]:
[ivy:install] cache/no-namespace/javax.transaction/jta/jars/jta-1.0.1B.jar file does not exist
...
[ivy:install] missing artifact javax.security#jacc;1.0/jacc.jar[jar]:
[ivy:install] cache/no-namespace/javax.security/jacc/jars/jacc-1.0.jar file does not exist

這表示源儲存庫(Maven Central)中缺少這兩個制品的 JAR 檔(可能因授權問題)。Ivy 採用「最大努力」策略,除缺失制品外,其他所有模組皆已安裝完成。

衝突管理與多版本共存

日誌中可見 commons-logging 同時安裝了 1.0.2 和 1.0.4 兩個版本。這是因為我們在設定中使用 defaultConflictManager="all"(不排除任何版本)。在建立私有儲存庫時,保留所有被傳遞依賴引用的版本至關重要,避免下游專案因缺少特定版本而導致不一致。

儲存庫結構差異:Ivy vs Maven

檢查安裝後的 Hibernate 目錄:

myrepository/no-namespace/org.hibernate/hibernate/ivys/ivy-3.2.5.ga.xml
myrepository/no-namespace/org.hibernate/hibernate/ivys/ivy-3.2.5.ga.xml.md5
myrepository/no-namespace/org.hibernate/hibernate/ivys/ivy-3.2.5.ga.xml.sha1
myrepository/no-namespace/org.hibernate/hibernate/jars/hibernate-3.2.5.ga.jar
myrepository/no-namespace/org.hibernate/hibernate/jars/hibernate-3.2.5.ga.jar.md5
myrepository/no-namespace/org.hibernate/hibernate/jars/hibernate-3.2.5.ga.jar.sha1

注意:這裡沒有 Maven 的 pom.xml,取而代之的是 Ivy 從原始 POM 轉換而來的 ivy.xml。這意味著你現在擁有一個純粹的 Ivy 儲存庫,可以充分發揮 Ivy 的進階功能(如模組配置、細粒度排除、每模組衝突管理等)。

結語

本教程展示了基礎儲存庫複製的完整流程,以及處理缺失制品、版本衝突的實務考量。下一篇將介紹如何處理來源與目的地儲存庫命名規則不一致的進階情境。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved