[gradle] api与implementation

简述

以往使用gradle引入依赖包时,我都用compile关键字:

    dependencies {
        compile "io.swagger:swagger-core:$swaggerVersion"
    }

这种做法会带来一些不必要的麻烦。举例说明:假如A使用compile依赖引入了B,在他人引入A依赖时,将被迫把B也导入到项目依赖中,可以直接使用其代码。
在gradle官网看文档,发现compile是已经被官方废弃,不再保证功能性的一个关键字。在gradle 3左右的版本中已支持implementationapi关键字,代替原先的compile功能:

  • 若A使用implementation依赖B,那B相关的代码只能在A包自己的代码中用到,我作为第三方引入A包后,不能使用和读到B相关的代码。
  • 若A使用api依赖B,那么和compile的场景一致,但它隐含了这样的含义:A这个包对外提供的api接口参数里,可能包含B定义的。(使用api需要在模块中apply plugin 'java-library'

展开

Gradle官方解释链接

implementation与api:

java-library与普通的plugin java的关键区别,在于java-library会提供api关键字,可以将一个依赖暴露给更上层的使用方。一个java-library就是一个被其它代码依赖的组件,在多project构建时很常用,也常见于外部依赖。
implementation用于定义组件完全在内部使用的依赖,api用于引入会通过api暴露给外部的依赖。

新关键字有哪些优势?

  • 依赖不会泄露给使用者,使用者在引入包时不会意外的新增一个子依赖;
  • 因为减少了classpath大小,有更快的编译速度;
  • 依赖项发生更改时,重新编译的东西更少了:无需重新编译它的使用者;
  • 更简洁的publish;
  • compile仍然可以使用,但是gradle官方已不再对它的功能做保证。
    ……
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom阅读 7,604评论 0 3
  • 说在前面:Gradle中project是非常重要的,所以也会有非常多的API及其可配置的属性,笔者也有许多不了解的...
    ywy_袁滚滚阅读 20,022评论 2 29
  • 在 Android Studio 构建的项目中,基于 Gradle 进行项目的构建,同时使用 Android DS...
    Ant_way阅读 12,128评论 0 16
  • 请允许我借鉴前辈们的东西~~~~ 感激不尽~~~~~ 以下为Android 框架排行榜 么么哒~ Android...
    嗯_新阅读 6,696评论 3 32
  • 对今生无望或者期盼很多的人,才会盼望来生。 来生你想做什么? 有人说,我想成为一条鱼,可以在水里游来游去; 有人说...
    子非泞阅读 2,688评论 0 5