封装性强
为了让生产者编译库,它需要编译类路径上的所有实现依赖项。有些依赖项仅需要作为库的实现细节,有些库实际上是 API 的一部分。
然而,依赖于这个生成的库的库只需要“查看”您的库的公共 API 以及该 API 的依赖项。它是生产者的编译类路径的子集:这是依赖项的强封装。
结果是分配给implementation
库配置的依赖项不会最终出现在使用者的编译类路径上。另一方面,分配给api
库配置的依赖项最终将出现在消费者的编译类路径上。然而,在运行时,所有依赖项都是必需的。即使在单个项目中,Gradle 也会区分不同类型的使用者:例如,Java 编译任务与 Java 执行任务是不同的使用者。
有关 Java 世界中 API 和运行时依赖项隔离的更多详细信息,请参见此处。
尊重消费者
作为开发人员,每当您决定包含依赖项时,您都必须了解这会给您的消费者带来后果。例如,如果您向项目添加依赖项,它就会成为使用者的传递依赖项,因此如果使用者需要不同的版本,则可能会参与冲突解决。
Gradle 处理的许多问题都是为了解决消费者和生产者期望之间的不匹配问题。
然而,有些项目比其他项目更容易:
请始终记住,您选择解决问题的解决方案可能会“泄漏”给您的消费者。本文档旨在指导您找到正确问题的正确解决方案,更重要的是,做出有助于解决引擎在发生冲突时做出正确决策的决策。