Gradle 通过查找元数据文件(.module
、.pom
或 ivy.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 构件
-
解析缺少元数据的依赖项时,请使用仅构件表示法(
@
)。 -
使用分类器指定构件的不同版本或变体。