依赖配置
在第 3 章中,您看到插件可以引入配置来定义依赖项的范围。 Java 插件引入了各种标准配置来定义依赖项应应用于 Java 构建生命周期的哪个存储桶。 例如,编译生产源代码所需的依赖项是通过编译配置添加的。 在构建 Web 应用程序时,您使用编译配置来声明对 Apache Commons Lang 库的依赖项。 为了更好地理解如何存储、配置和访问配置,让我们看看 Gradle API 中的负责接口。
了解配置 API 表示
可以在项目的根级别直接添加和访问配置; 您可以决定使用插件提供的配置之一或声明您自己的配置。 每个项目都拥有一个 ConfigurationContainer 类的容器,用于管理相应的配置。 配置的行为非常灵活。 您可以控制传递依赖项是否应该成为依赖项解析的一部分,定义解析策略(例如,如何响应冲突的工件版本),甚至使配置相互扩展。 图 5.5 显示了相关的 Gradle API 接口及其方法。 配置的另一种思考方式是逻辑分组。 按配置对依赖项进行分组与将 Java 类组织到包中的概念类似。 包为其包含的类提供唯一的命名空间。 配置也是如此。 它们将服务于特定职责的依赖项分组。

Java 插件已经提供了六种开箱即用的配置:compile、runtime、testCompile、testRuntime、archives 和 default。 难道你不能只使用这些配置之一来声明对 Cargo 库的依赖吗? 一般来说,您可以,但是您会混合与您的应用程序代码和您为部署应用程序编写的基础设施代码相关的依赖项。 在发行版中添加不必要的库可能会导致运行时出现不可预见的副作用,因此应不惜一切代价避免。 例如,使用编译配置将生成包含 Cargo 库的 WAR 文件。 接下来,我将展示如何为 Cargo 库定义自定义配置。
定义自定义配置
为了清楚地识别 Cargo 所需的依赖项,您需要使用唯一名称 Cargo 声明一个新配置,如以下清单所示。
configurations {
cargo { // 按名称定义新配置
// 设置配置的描述和可见性
description = 'Classpath for Cargo Ant tasks.'
visible = false
}
}
groovy
目前,您只处理一个 Gradle 项目。 限制此配置对此项目的可见性是为多项目设置做准备时有意识的选择。 如果您想了解有关由多个项目组成的构建的更多信息,请查看第 6 章。如果不需要,您不希望配置溢出到其他项目中。 当您列出项目的依赖项时,会直接反映为配置设置的描述:
$ gradle dependencies
:dependencies
------------------------------------------------------------
Root project
------------------------------------------------------------
cargo - Classpath for Cargo Ant tasks.
No dependencies
bash
将配置添加到项目的配置容器后,可以通过其名称进行访问。 接下来,您将使用 cargo 配置将第三方 Cargo Ant 任务公开给构建脚本。
访问配置
本质上,Ant 任务是遵循 Ant 扩展端点来定义自定义逻辑的 Java 类。 要将非标准 Ant 任务(例如 Cargo 部署任务)添加到您的项目中,您需要使用 Taskdef Ant 任务来声明它。 要解析 Ant 任务实现类,需要分配包含它们的 Cargo JAR 文件。 下一个清单显示了通过名称访问配置是多么容易。 该任务使用已解析的依赖项并将它们分配给 Cargo Ant 任务所需的类路径。
task deployToLocalTomcat << {
// 获取 cargo 配置的所有依赖项作为文件树
FileTree cargoDeps = configurations.getByName('cargo').asFileTree
// 使用完全限定依赖项的串联路径来解析 Cargo Ant 任务定义
ant.taskdef(resource: 'cargo.tasks', classpath: cargoDeps.asPath)
// 使用 Cargo Ant 任务自动下载 Tomcat 7 发行版、部署 WAR 文件并在容器中运行
ant.cargo(containerId: 'tomcat7x', action: 'run', output: "$buildDir/output.log") {
configuration {
deployable(type: 'war', file: 'todo.war')
}
zipUrlInstaller(installUrl: 'http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.32/bin/apache-tomcat-7.0.32.zip')
}
}
groovy
如果您不理解代码示例中的所有内容,请不要担心。 重要的是您认识允许您访问配置的 Gradle API 方法。 其余代码主要是通过 Gradle 的 DSL 表达的特定于 Ant 的配置。 第 9 章将为您提供有关使用 Gradle 中的 Ant 任务的内幕消息。 设置好部署任务后,就可以将 Cargo 依赖项分配给 Cargo 配置了。