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

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

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

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

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

  • 您只想下载特定构件,而不包含传递性依赖项。

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

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

Google Hosted Libraries 提供开源 JavaScript 库。使用仅构件表示法,您可以获取 jquery.js 等 JavaScript 文件。

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

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:解析带分类器的构件

某些库提供构件的多种变体或风格。在 Java 中,一个库可能会发布:

  • 包含类文件的编译构件。

  • 包含源代码的单独构件。

  • 另一个包含 Javadocs

同样,在 JavaScript 中,库通常具有:

  • 未压缩版本。

  • 精简版本(为生产优化)。

要指定特定变体,可以使用分类器。在 Gradle 中,分类器允许您获取模块中的特定构件。

您可以通过指定分类器 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 构件

  • 解析缺少元数据的依赖项时,请使用仅构件表示法(@

  • 使用分类器指定构件的不同版本或变体。