介绍编译时依赖
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 提供反馈和问题。