引入仅编译依赖
目录
简介
最受期待的 Gradle 功能之一已在 Gradle 2.12 中推出:支持声明仅编译时依赖。对于熟悉 Maven 的 Java 开发者来说,仅编译时依赖的功能类似于 Maven 的 provided
作用域,允许您声明仅在编译时使用的非传递依赖。虽然 Gradle War 插件的用户已经可以使用类似的功能,但现在所有使用 Java 插件的 Java 项目都可以声明仅编译时依赖。
仅编译时依赖解决了许多用例,包括
- 编译时需要但在运行时从不需要的依赖,例如仅源代码注解或注解处理器;
- 编译时需要但在运行时仅在使用某些功能时才需要的依赖,也称为可选依赖;
- API 在编译时是必需的,但其实现将由消费库、应用程序或运行时环境提供的依赖。
仅编译时依赖与常规 compile
依赖截然不同。它们不包含在运行时类路径中,并且是非传递的,这意味着它们不包含在依赖项目中。当使用 Gradle 项目依赖以及发布到 Maven 或 Ivy 仓库时,情况都是如此。在后一种情况下,仅编译时依赖只是从发布的元数据中省略。
作为我们对高质量 IDE 支持承诺的一部分,仅编译时依赖继续与 Gradle 的 IDEA 和 Eclipse 插件一起工作。在 IntelliJ IDEA 中使用时,仅编译时依赖映射到 IDEA 自己的 provided
作用域。在 Eclipse 中,仅编译时依赖不会通过项目依赖导出。
在 Gradle 模型中,我们认为测试是生产代码的“消费者”。考虑到这一点,测试类路径不会继承仅编译时依赖。其目的是,像任何其他运行时环境一样,测试应该提供自己的实现,无论是使用模拟对象还是其他一些依赖。
声明仅编译时依赖很简单——只需将依赖分配给适当源集的新 compileOnly
配置即可
dependencies {
compileOnly 'javax.servlet:servlet-api:2.5'
}
由于添加了 compileOnly
配置,compile
配置不再代表所有编译时依赖的完整视图。当需要在构建脚本或自定义插件中引用编译类路径时,应改为使用适当源集的 compileClasspath
属性。
有关更多信息,请参阅 Gradle 用户指南的 Java 插件 章节。与往常一样,我们欢迎您在下方评论区或通过 Gradle 论坛 discuss.gradle.org 提供反馈和问题。