Gradle 依赖关系中 compile和 implementation的区别


将在一个项目中展示implementation,api以及compile之间的差异。

假设我有一个包含三个Gradle模块的项目:

  • app(Android应用)
  • my-android-library(Android库)
  • my-java-library(Java库)

app具有my-android-library与依赖。my-android-library具有my-java-library依赖。

依赖1

my-java-library有一个MySecret班

public class MySecret { public static String getSecret() { return "Money"; } }

my-android-library 拥有一个类 MyAndroidComponent,里面有调用 MySecret 类的值。

public class MyAndroidComponent { private static String component = MySecret.getSecret(); public static String getComponent() { return "My component: " + component; } }

最后,app 只对来自 my-android-library

TextView tvHelloWorld = findViewById(R.id.tv_hello_world); tvHelloWorld.setText(MyAndroidComponent.getComponent());

现在,让我们谈谈依赖性...

app需要:my-android-library库,所以在app build.gradle文件中使用implementation

(注意:您也可以使用api/compile, 但是请稍等片刻。)

dependencies { implementation project(':my-android-library') }

依赖2

您认为 my-android-library 的 build.gradle应该是什么样?我们应该使用哪个范围?

我们有三种选择:

dependencies { // 选择 #1 implementation project(':my-java-library') // 选择 #2 compile project(':my-java-library') // 选择 #3 api project(':my-java-library') }

依赖3

它们之间有什么区别,我应该使用什么?

compile 或 api(选项#2或#3)

依赖4

如果您使用 compile 或 api。我们的 Android 应用程序现在可以访问 MyAndroidComponent 依赖项,它是一个MySecret 类。

TextView textView = findViewById(R.id.text_view); textView.setText(MyAndroidComponent.getComponent()); // 你可以访问 MySecret textView.setText(MySecret.getSecret());

implementation(选项1)

依赖5

如果您使用的是 implementation 配置,MySecret 则不会公开。

 
TextView textView = findViewById(R.id.text_view); textView.setText(MyAndroidComponent.getComponent()); // 你无法访问 MySecret 类 textView.setText(MySecret.getSecret()); // 无法编译的

那么,您应该选择哪种配置?取决于您的要求。

如果要公开依赖项,请使用 api 或 compile。

如果您不想公开依赖项(隐藏您的内部模块),请使用implementation。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM