Gradle 模块依赖中,使用 implementation 与 api 的区别

文章目录

  • 关键字 api:使用关键字 api 声明的依赖项表示该模块将向依赖自己的模块公开自己依赖的 API。这意味着其他模块可以使用该依赖项提供的所有公共类和方法,以及该依赖项的传递依赖项提供的所有公共类和方法。当需要在本模块和依赖它的其他模块之间共享代码时,可以使用关键字 api

    例如,如果模块 A 使用模块 B,并且模块 B 使用了关键字 api 声明某个依赖项,那么模块 A 也可以使用该依赖项的所有公共 API。这通常用于需要在模块之间共享代码的情况,例如库模块和应用程序模块之间的依赖关系。

  • 关键字 implementation:使用关键字 implementation 声明的依赖项表示该模块将不向依赖自己的模块公开自己依赖的 API。这意味着该依赖项只对该模块本身可见,并且不会被传递到依赖该模块的其他模块。当不需要将某个依赖项的 API 公开给其他模块时,可以使用关键字 implementation

    例如,如果模块 A 使用模块 B,而模块 B 使用了关键字 implementation 声明某个依赖项,那么模块 A 将无法使用该依赖项的任何公共 API。这通常用于需要在模块之间隔离依赖关系的情况,例如应用程序模块和库模块之间的依赖关系。

总之,使用关键字 api 声明依赖项时,可以将该依赖项的公共 API 与其他模块共享。而使用关键字 implementation 声明依赖项时,可以将该依赖项限制在当前模块内。


【注意】

  对依赖模块使用关键字 api,并不能使本模块能传递性地获得依赖模块依赖的所有依赖。对本模块来说,依赖时无论是使用关键字 api 还是 implementation 都没有区别。关键字 api 的作用只在其它模块依赖本模块时才会体现。换句话说,如果想令本模块能传递性地获得依赖模块的依赖,那么应该在依赖模块的相应依赖中使用关键字 api,而不是在本模块中使用


举个例子。如果项目中有模块 A、B、C、D,且 A 依赖 B、B 依赖 C、C 依赖 D。在不考虑各个模块其它依赖的干扰的情况下。

  • 如果 A api B,B implementation C

    则 A 可以直接引用 B 中的类,但不能引用 C 中的类

  • 如果 A implementation B,B implementation C

    则 A 可以直接引用 B 中的类,但不能引用 C 中的类

  • 如果 A api B,B api C

    则 A 可以直接引用 B、C 中的类

  • 如果 A implementation B,B api C

    则 A 可以直接引用 B、C 中的类

  • 如果 A api B,B implementation C,C api D

    则 A 可以直接引用 B 中的类,但不能引用 C、D 中的类

  • 如果 A implementation B,B implementation C,C api D

    则 A 可以直接引用 B 中的类,但不能引用 C、D 中的类

也就是说,如果 B implementation C,则不管使用什么关键字,都无法通过 B 来依赖 C。

对 B 而言,无论是对 C 使用 implementation 还是 api,都不会影响 B 对 C 的访问。不过,这样做虽然不会影响 B 自己,但会影响 A 通过 B 对 C 的访问。因此,这两个关键字实际上只影响别人,不影响自己。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值