Gradle配置implementation、api与compile的区别

自Gradle 3.4开始,compile被废弃,取而代之的是implementation和api两个配置项。

掌握这三者的区别实际上就是要清楚什么情况使用implementation替换compile,什么情况下使用api替换compile。

implementation替换compile

使用implementation配置依赖,对Gradle来说:

  • 编译时:不允许外部模块调用此依赖包,除非外部模块自己声明此依赖
  • 运行时:此依赖包只允许在运行时使用反射机制调用。

也就是说模块使用implementation屏蔽了外部模块直接调用它声明的依赖。

这样做有几个好处:(翻译自Gradle 文档

  • 依赖关系不会泄漏到消费者的编译类路径中,所以永远不会意外地依赖于传递依赖项
  • 由于减少的类路径大小编译更快
  • 当实现依赖关系发生变化时,重新编译会更少:消费者不需要重新编译
  • cleaner发布:当与新的maven-publish插件结合使用时,Java库会生成POM文件,这些文件可以精确地区分编译库所需的内容和运行时使用库所需的内容(换句话说,不要混合编译library本身所需的东西,以及编译library所需的东西)。

api替换compile

编译时与implementation相反,它允许外部模块不管在编译时还是运行时都可以调用api声明的依赖。和原来的compile很类似。

使用api声明依赖,如果依赖发生变化,所有访问到此依赖的模块都需要重新编译。因此它会增加模块的编译时间。

总结

大部分情况下都应该使用implementation替换compile,只有在一些库模块才考虑使用api替换compile。

版权声明:著作权归作者所有。

相关推荐

Java使用Gradle依赖配置compile,implementation和api的区别

这个主要看Java项目所使用的Gradle的版本。Gradle3.4新增了Java-library插件,java-library插件使用了新的依赖配置implementation和api。旧的依赖配置compile被废弃。Gradle3.4之前的版本java插件apply plugin: 'java' 添加依赖dependencies { compile '

JavaScript里null与undefined的区别与相似点

初次看,null和undefined看似是一样的,但远非如此。 本文将探讨JavaScript中null和undefined的区别和相似之处。null是什么?有两个你应该理解的null特性:null是空的或不存在的值。null必须显式赋值。将null的值赋给a示例:let a = null; console.log(a); // 输出null un

MySQL:datetime与timestamp的区别及使用选择

datetime与timestamp的区别1、存储空间不同在MySQL,timestamp在内部存储为整型,占用4个字节,而datetime占用8个字节。2、存储方式不同timestamp存储时,会从插入时间的客户端时区转换为UTC(世界标准时间)时间存储,而datetime不会做时间的转换直接存储。3、存储的时间范围不同timestamp:UTC时间,1970-01-01 00:00:

[译]Angular构造函数与ngOnInit的本质区别

在Stackoverflow上最受欢迎的其中一个Angular问题是构造函数与ngOnInit的区别,这个问题已经超过了100k的浏览量。在那我回答了此问题,但还是决定在这篇文章展开说明。这个问题的大部分回答以及网络里的文章都是集中在两者在使用上的不同,这里我想给出一个比较全面的比较,挖掘组件初始化的过程。JS/TS语言相关的区别我们先从一个与语言本身有关的最明显的区别开始。ngOnInit只是一