隆重推出编译时依赖
目录
引言
Gradle 2.12 中最令人期待的 Gradle 功能之一现已发布:支持声明编译时依赖。对于熟悉 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提出您的反馈和问题。