如何使用 Gradle 解析模块依赖中的特定 Artifacts
Gradle 通过查找元数据文件(.module
、.pom
或 ivy.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 的文件扩展名分开
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")
}
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
文件。
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")
}
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 的不同版本或变体。