依賴關係中繼資料指的是與依賴關係相關聯的資訊,用於描述其特性、關係和需求。

此中繼資料包含以下詳細資訊,例如

  1. 身分:模組依賴關係透過其群組、名稱和版本 (GAV) 座標來唯一識別。

  2. 依賴關係:此依賴關係所需的其他二進制檔案的列表,包括其版本。

  3. 變體:元件的不同形式(例如,compile、runtime、apiElements、runtimeElements),可以在不同的情境中使用。

  4. 成品:元件產生的實際檔案(例如 JAR、ZIP 等),可能包含已編譯的程式碼、資源或文件。

  5. 功能:描述模組提供或使用的功能或特性,有助於避免不同模組提供相同功能時發生衝突。

  6. 屬性:用於區分變體的鍵值對(例如 org.gradle.jvm.version:8)。

依賴關係中繼資料根據儲存庫類型,以不同的格式儲存

  • Gradle: Gradle 模組中繼資料 (.module) 檔案

  • Maven: Maven POM (pom.xml) 檔案

  • Ivy: Ivy 描述符 (ivy.xml) 檔案

某些儲存庫可能包含單一元件的多種中繼資料類型。當 Gradle 發佈到 Maven 儲存庫時,它會同時發佈 Gradle 模組中繼資料 (GMM) 檔案和 Maven POM 檔案。

此中繼資料在依賴關係解析中扮演關鍵角色,允許二進制成品的依賴關係與成品本身一起追蹤。透過讀取依賴關係中繼資料,Gradle 能夠判斷給定依賴關係所需的其他成品版本。

支援的中繼資料格式

外部模組依賴關係需要模組中繼資料,以便 Gradle 可以判斷模組的傳遞依賴關係。Gradle 支援各種中繼資料格式以實現此目的。

Gradle 模組中繼資料 (GMM) 檔案

Gradle 模組中繼資料專門設計來支援 Gradle 依賴關係管理模型的所有功能,使其成為首選格式。

您可以在此處找到規格

{
  "formatVersion": "1.1",
  "component": {
    "group": "com.example",
    "module": "my-library",
    "version": "1.0"
  }
}

POM 檔案

Gradle 原生支援 Maven POM 檔案。預設情況下,Gradle 會先尋找 POM 檔案。但是,如果檔案包含特殊標記,Gradle 將改為使用 Gradle 模組中繼資料

<project xmlns="http://maven.apache.org/POM/4.0.0">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example</groupId>
  <artifactId>my-library</artifactId>
  <version>1.0</version>
</project>

Ivy 檔案

Gradle 也支援 Ivy 描述符檔案。Gradle 會先尋找 ivy.xml 檔案,但如果此檔案包含特殊標記,它將改為使用 Gradle 模組中繼資料

<ivy-module version="2.0">
  <info organisation="com.example" module="my-library" revision="1.0"/>
  <dependencies>
    <dependency org="org.example" name="dependency" rev="1.2"/>
  </dependencies>
</ivy-module>

支援的中繼資料來源

在儲存庫中搜尋元件時,Gradle 預設會檢查支援的中繼資料檔案格式。

Gradle 首先尋找 .module (Gradle 模組中繼資料) 檔案。在 Maven 儲存庫中,Gradle 接著尋找 .pom 檔案。在 Ivy 儲存庫中,它會檢查 ivy.xml 檔案。在平面目錄儲存庫中,它會直接尋找 .jar 檔案,而不期望任何中繼資料。

如果您定義自訂儲存庫,則可以配置 Gradle 如何搜尋中繼資料。例如,您可以設定 Maven 儲存庫,選擇性地解析沒有關聯 POM 檔案的 JAR。這可以透過為儲存庫配置中繼資料來源來完成

build.gradle.kts
repositories {
    maven {
        url = uri("http://repo.mycompany.com/repo")
        metadataSources {
            mavenPom()
            artifact()
        }
    }
}
build.gradle
repositories {
    maven {
        url = "http://repo.mycompany.com/repo"
        metadataSources {
            mavenPom()
            artifact()
        }
    }
}

您可以指定多個中繼資料來源,而 Gradle 將以預定義的順序搜尋它們。支援以下中繼資料來源

中繼資料來源 描述 預設順序 Maven Ivy / 平面目錄

gradleMetadata()

尋找 Gradle .module 檔案

第 1 個

mavenPom()

尋找 Maven .pom 檔案

第 2 個

ivyDescriptor()

尋找 ivy.xml 檔案

第 2 個

artifact()

直接尋找成品,而不使用關聯的中繼資料

第 3 個

預設情況下,Gradle 將要求依賴關係具有關聯的中繼資料。

若要放寬此要求,並允許 Gradle 解析沒有關聯中繼資料的成品,請指定 artifact 中繼資料來源

mavenCentral {
    metadataSources {
        mavenPom()
        artifact()
    }
}

以上範例指示 Gradle 首先從 POM 檔案尋找元件中繼資料,如果不存在,則從成品本身衍生中繼資料。

在剖析中繼資料檔案(Ivy 或 Maven)時,Gradle 會檢查標記,以指示是否存在相符的 Gradle 模組中繼資料檔案。如果找到,Gradle 將優先使用 Gradle 中繼資料。

若要停用此行為,請使用 ignoreGradleMetadataRedirection() 選項

build.gradle.kts
repositories {
    maven {
        url = uri("http://repo.mycompany.com/repo")
        metadataSources {
            mavenPom()
            artifact()
            ignoreGradleMetadataRedirection()
        }
    }
}
build.gradle
repositories {
    maven {
        url = "http://repo.mycompany.com/repo"
        metadataSources {
            mavenPom()
            artifact()
            ignoreGradleMetadataRedirection()
        }
    }
}