Gradle 模块元数据是一种用于序列化 Gradle 组件模型的格式。它类似于 Apache Maven™ 的 POM 文件Apache Ivy™ 的 ivy.xml 文件。元数据文件的目标是为 消费者 提供一个关于发布到存储库的内容的合理模型。

Gradle 模块元数据是一种独特的格式,旨在通过使其支持多平台和变体感知来改进依赖项解析。

特别是,Gradle 模块元数据支持

发布 Gradle 模块元数据将为您的消费者提供更好的依赖项管理

使用 Maven Publish 插件Ivy Publish 插件 时,Gradle 模块元数据会自动发布。

Gradle 模块元数据的规范可以在 这里 找到。

与其他格式的映射

Gradle 模块元数据会自动发布到 Maven 或 Ivy 存储库。但是,它不会取代 pom.xmlivy.xml 文件:它与这些文件一起发布。这样做是为了最大化与第三方构建工具的兼容性。

Gradle 尽力将 Gradle 特定的概念映射到 Maven 或 Ivy。当构建文件使用只能在 Gradle 模块元数据中表示的功能时,Gradle 会在发布时发出警告。下表总结了某些 Gradle 特定功能如何映射到 Maven 和 Ivy

表 1. Gradle 特定概念到 Maven 和 Ivy 的映射
Gradle Maven Ivy 描述

依赖项约束

<dependencyManagement> 依赖项

未发布

Gradle 依赖项约束是 传递的,而 Maven 的依赖项管理块 不是

丰富的版本约束

发布 所需 版本

发布 所需 版本

组件功能

未发布

未发布

组件功能是 Gradle 独有的

功能变体

变体工件已上传,依赖项作为 可选 依赖项发布

变体工件已上传,依赖项未发布

功能变体是可选依赖项的良好替代品

自定义组件类型

工件已上传,依赖项是映射描述的那些

工件已上传,依赖项被忽略

自定义组件类型在任何情况下都可能无法从 Maven 或 Ivy 消费。它们通常存在于自定义生态系统的上下文中。

禁用元数据兼容性发布警告

如果您想抑制警告,可以使用以下 API 来实现

build.gradle.kts
publications {
    register<MavenPublication>("maven") {
        from(components["java"])
        suppressPomMetadataWarningsFor("runtimeElements")
    }
}
build.gradle
publications {
    maven(MavenPublication) {
        from components.java
        suppressPomMetadataWarningsFor('runtimeElements')
    }
}

与其他构建工具的交互

由于 Gradle 模块元数据并未广泛传播,并且旨在 最大化与其他工具的兼容性,Gradle 执行了一些操作

  • Gradle 模块元数据与给定存储库(Maven 或 Ivy)的常规描述符一起系统地发布

  • pom.xmlivy.xml 文件将包含一个 标记注释,它告诉 Gradle 该模块存在 Gradle 模块元数据

该标记的目标 不是 让其他工具解析模块元数据:它仅供 Gradle 用户使用。它向 Gradle 解释存在一个 更好 的模块元数据文件,并且应该使用它。这并不意味着从 Maven 或 Ivy 消费会中断,只是它在 降级模式 下工作。

这必须被视为一种 性能优化:Gradle 不会执行两次网络请求,一次获取 Gradle 模块元数据,然后一次在未命中的情况下获取 POM/Ivy 文件,而是首先查找最可能存在的文件,然后只有当模块确实已发布到 Gradle 模块元数据时才执行第二次请求。

如果您知道您所依赖的模块始终与 Gradle 模块元数据一起发布,您可以通过配置存储库的元数据源来优化网络调用

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

Gradle 模块元数据验证

Gradle 模块元数据在发布前经过验证。

强制执行以下规则

这些规则确保了生成元数据的质量,并有助于确认消费不会出现问题。

Gradle 模块元数据可重现性

由于其实现方式,生成模块元数据文件的任务当前从未被 Gradle 标记为 UP-TO-DATE。但是,如果构建输入和构建脚本都没有改变,则任务结果实际上是最新状态:它始终生成相同的输出。

如果用户希望每个构建调用都有一个唯一的 module 文件,则可以将生成元数据中的标识符链接到创建它的构建。用户可以选择在其 publication 中启用此唯一标识符

build.gradle.kts
publishing {
    publications {
        create<MavenPublication>("myLibrary") {
            from(components["java"])
            withBuildIdentifier()
        }
    }
}
build.gradle
publishing {
    publications {
        myLibrary(MavenPublication) {
            from components.java
            withBuildIdentifier()
        }
    }
}

通过上述更改,生成的 Gradle 模块元数据文件将始终不同,从而强制下游任务将其视为过时。

禁用 Gradle 模块元数据发布

在某些情况下,您可能希望禁用 Gradle 模块元数据的发布

  • 您正在上传的存储库拒绝元数据文件(未知格式)

  • 您正在使用未正确映射到 Gradle 模块元数据的 Maven 或 Ivy 特定概念

在这种情况下,禁用 Gradle 模块元数据的发布只需禁用生成元数据文件的任务

build.gradle.kts
tasks.withType<GenerateModuleMetadata> {
    enabled = false
}
build.gradle
tasks.withType(GenerateModuleMetadata) {
    enabled = false
}