Gradle 通过查找元数据文件(.module.pomivy.xml)和默认的 artifact(通常是 JAR)来解析模块依赖项。如果找不到这些文件,构建将失败。在某些情况下,您可能需要自定义 Gradle 解析 artifact 的方式。

为什么要使用自定义 Artifact 解析?

在以下场景中,您可能需要调整 artifact 解析:

  • 依赖项提供了一个非标准 artifact(例如 ZIP 文件),并且没有元数据。

  • 模块元数据声明了多个 artifact(例如 Ivy 依赖描述符)。

  • 您只想下载某个特定的 artifact,而不包括传递依赖项。

步骤 1:解析没有元数据的 Artifact

假设您想构建一个使用 JavaScript 库(例如 jQuery)的 Web 应用程序,并希望从仓库下载它们,而不是将它们检入版本控制。

Google Hosted Libraries 提供了开源 JavaScript 库。使用仅 Artifact 符号 (artifact-only notation),您可以获取像 jquery.js 这样的 JavaScript 文件。

字符 @ 将依赖项的坐标与 artifact 的文件扩展名分开

build.gradle.kts
repositories {
    ivy {
        url = uri("https://ajax.googleapis.ac.cn/ajax/libs")
        patternLayout {
            artifact("[organization]/[revision]/[module].[ext]")
        }
        metadataSources {
            artifact()
        }
    }
}

configurations {
    create("js")
}

dependencies {
    "js"("jquery:jquery:3.2.1@js")
}
build.gradle
repositories {
    ivy {
        url = 'https://ajax.googleapis.ac.cn/ajax/libs'
        patternLayout {
            artifact '[organization]/[revision]/[module].[ext]'
        }
        metadataSources {
            artifact()
        }
    }
}

configurations {
    js
}

dependencies {
    js 'jquery:jquery:3.2.1@js'
}

步骤 2:解析带 Classifier 的 Artifact

一些库提供 artifact 的多种变体或风格 (flavors)。在 Java 中,一个库可能发布:

  • 带有类文件的编译后 artifact。

  • 包含源代码的独立 artifact。

  • 另一个包含 Javadocs

类似地,在 JavaScript 中,库通常具有:

  • 一个未压缩版本。

  • 一个压缩版本(针对生产环境优化)。

要指定某个特定变体,您可以使用 classifier。在 Gradle 中,classifier 允许您获取模块中的某个特定 artifact。

您可以通过指定 classifier min 来获取压缩版本 (jquery.min.js),而不是下载未压缩的 jquery.js 文件。

build.gradle.kts
repositories {
    ivy {
        url = uri("https://ajax.googleapis.ac.cn/ajax/libs")
        patternLayout {
            artifact("[organization]/[revision]/[module](.[classifier]).[ext]")
        }
        metadataSources {
            artifact()
        }
    }
}

configurations {
    create("js")
}

dependencies {
    "js"("jquery:jquery:3.2.1:min@js")
}
build.gradle
repositories {
    ivy {
        url = 'https://ajax.googleapis.ac.cn/ajax/libs'
        patternLayout {
            artifact '[organization]/[revision]/[module](.[classifier]).[ext]'
        }
        metadataSources {
            artifact()
        }
    }
}

configurations {
    js
}

dependencies {
    js 'jquery:jquery:3.2.1:min@js'
}

总结

Gradle 可以从外部仓库获取像 JavaScript 库这样的非 Java artifact。

  • 在解析缺少元数据的依赖项时,使用仅 Artifact 符号 (@)

  • 使用 classifiers 来指定 artifact 的不同版本或变体。