前言:
平时在做开发的时候,各种依赖三方库。一般就是在build.gradle中添加如下代码:
dependencies {
implementation 'com.google.android.material:material:1.9.0'
}
这里随便举个例子。
今天在开发的时候,遇到如下错误:
Check your module classpath for missing or conflicting dependencies
当时查了好多资料,有说依赖缺失的,有说依赖冲突的,有说清理缓存重新build的,各种姿势我都尝试了,无果之后,请教了同事。同事说,把引入依赖从implementation换成api试试,结果就可以了。
借此机会正好了解下这两个api的区别。
背景:
是在主APP中,使用了module中的第三方库的功能,报了上面的错误。
怎么解决:
把module中的依赖三方库的implementation换成了api
为什么出现这个问题:
查过资料有提到过,应该是kotlin和java的语法bug,如果直接使用java写就没这个问题
一、Implementation(实现)
- 在Gradle中,”implementation”是一种依赖配置,用于指定项目对外部库的实际依赖。
- 当我们在项目中使用”implementation”关键字引入外部库时,这些库的实现细节将只在当前模块中可见,并且不会传递给依赖当前模块的其他模块。
- 这意味着,如果你的模块A依赖于库X并使用”implementation”关键字引入,而另一个模块B依赖于模块A,则模块B无法直接访问库X。这样可以避免库的冲突和隐藏实现细节,提高代码的模块化和隔离性。
二、API(应用程序接口)
- “api”是Gradle中另一种依赖配置,它用于指定项目对外部库的公共接口。
- 当我们在项目中使用”api”关键字引入外部库时,这些库的接口将对所有依赖当前模块的其他模块可见。
- 换句话说,如果你的模块A依赖于库X并使用”api”关键字引入,那么模块B也可以直接访问库X,并使用它所提供的公共接口。这样做可以实现库的共享和交互,但也要注意可能造成的依赖传递和版本冲突问题。
三、区别与用途
- Implementation和API的依赖范围: “implementation”关键字用于将依赖的库隐藏在当前模块内,只能在当前模块中访问,不会传递给其他依赖该模块的模块。而”api”关键字用于将依赖的库的公共接口暴露给其他模块,可以在其他依赖该模块的模块中直接访问。
- 使用建议: 通常情况下,推荐使用”implementation”关键字来声明项目对外部库的依赖,这样可以降低库的耦合性,减少潜在的冲突。只有当确实需要在其他模块中访问库的公共接口时,才使用”api”关键字。