依賴關係中繼資料指的是與依賴關係相關聯的資訊,用於描述其特性、關係和需求。
此中繼資料包含以下詳細資訊,例如
-
身分:模組依賴關係透過其群組、名稱和版本 (GAV) 座標來唯一識別。
-
依賴關係:此依賴關係所需的其他二進制檔案的列表,包括其版本。
-
變體:元件的不同形式(例如,compile、runtime、apiElements、runtimeElements),可以在不同的情境中使用。
-
成品:元件產生的實際檔案(例如 JAR、ZIP 等),可能包含已編譯的程式碼、資源或文件。
-
功能:描述模組提供或使用的功能或特性,有助於避免不同模組提供相同功能時發生衝突。
-
屬性:用於區分變體的鍵值對(例如
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。這可以透過為儲存庫配置中繼資料來源來完成
repositories {
maven {
url = uri("http://repo.mycompany.com/repo")
metadataSources {
mavenPom()
artifact()
}
}
}
repositories {
maven {
url = "http://repo.mycompany.com/repo"
metadataSources {
mavenPom()
artifact()
}
}
}
您可以指定多個中繼資料來源,而 Gradle 將以預定義的順序搜尋它們。支援以下中繼資料來源
中繼資料來源 | 描述 | 預設順序 | Maven | Ivy / 平面目錄 |
---|---|---|---|---|
|
尋找 Gradle |
第 1 個 |
是 |
是 |
|
尋找 Maven |
第 2 個 |
是 |
是 |
|
尋找 |
第 2 個 |
否 |
是 |
|
直接尋找成品,而不使用關聯的中繼資料 |
第 3 個 |
是 |
是 |
預設情況下,Gradle 將要求依賴關係具有關聯的中繼資料。
若要放寬此要求,並允許 Gradle 解析沒有關聯中繼資料的成品,請指定 artifact
中繼資料來源
mavenCentral {
metadataSources {
mavenPom()
artifact()
}
}
以上範例指示 Gradle 首先從 POM 檔案尋找元件中繼資料,如果不存在,則從成品本身衍生中繼資料。
在剖析中繼資料檔案(Ivy 或 Maven)時,Gradle 會檢查標記,以指示是否存在相符的 Gradle 模組中繼資料檔案。如果找到,Gradle 將優先使用 Gradle 中繼資料。
若要停用此行為,請使用 ignoreGradleMetadataRedirection()
選項
repositories {
maven {
url = uri("http://repo.mycompany.com/repo")
metadataSources {
mavenPom()
artifact()
ignoreGradleMetadataRedirection()
}
}
}
repositories {
maven {
url = "http://repo.mycompany.com/repo"
metadataSources {
mavenPom()
artifact()
ignoreGradleMetadataRedirection()
}
}
}