简述
以往使用gradle引入依赖包时,我都用compile
关键字:
dependencies {
compile "io.swagger:swagger-core:$swaggerVersion"
}
这种做法会带来一些不必要的麻烦。举例说明:假如A使用compile
依赖引入了B,在他人引入A依赖时,将被迫把B也导入到项目依赖中,可以直接使用其代码。
在gradle官网看文档,发现compile
是已经被官方废弃,不再保证功能性的一个关键字。在gradle 3左右的版本中已支持implementation
与api
关键字,代替原先的compile
功能:
- 若A使用
implementation
依赖B,那B相关的代码只能在A包自己的代码中用到,我作为第三方引入A包后,不能使用和读到B相关的代码。 - 若A使用
api
依赖B,那么和compile的场景一致,但它隐含了这样的含义:A这个包对外提供的api接口参数里,可能包含B定义的。(使用api
需要在模块中apply plugin 'java-library'
)
展开
implementation与api:
java-library
与普通的pluginjava
的关键区别,在于java-library
会提供api关键字,可以将一个依赖暴露给更上层的使用方。一个java-library就是一个被其它代码依赖的组件,在多project构建时很常用,也常见于外部依赖。
implementation
用于定义组件完全在内部使用的依赖,api
用于引入会通过api暴露给外部的依赖。
新关键字有哪些优势?
- 依赖不会泄露给使用者,使用者在引入包时不会意外的新增一个子依赖;
- 因为减少了classpath大小,有更快的编译速度;
- 依赖项发生更改时,重新编译的东西更少了:无需重新编译它的使用者;
- 更简洁的publish;
compile
仍然可以使用,但是gradle官方已不再对它的功能做保证。
……