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依赖。

将在一个项目中展示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()); // 无法编译的

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

如果要公开依赖项,请使用 apicompile

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

注意:这只是 Gradle 配置的要点,请参阅 表49.1 Java库插件-用于声明依赖的配置,有更详细的说明。


可在https://github.com/aldoKelvia... 上找到此答案的示例项目。

相关文章
|
安全 Cloud Native Go
解决Gradle依赖问题:不安全协议的处理策略Could not resolve all dependencies for configuration ‘:detachedConfiguration9
解决Gradle依赖问题:不安全协议的处理策略Could not resolve all dependencies for configuration ‘:detachedConfiguration9
1089 0
|
JavaScript Java Maven
|
2月前
|
Java Spring
Gradle 如何确保依赖的版本兼容性
Gradle 通过依赖管理机制确保版本兼容性,使用声明式配置定义项目依赖,自动解析和下载所需库。它支持版本范围和动态版本,通过冲突解决策略选择最佳版本,保证构建的一致性和可靠性。
150 3
|
6月前
|
Java 数据库连接 数据库
在Maven或者Gradle构建配置中添加了必要的依赖
在Maven或者Gradle构建配置中添加了必要的依赖
69 1
|
7月前
|
Java 关系型数据库 MySQL
Gradle中的依赖Dependencies说明与使用总结
Gradle中的依赖Dependencies说明与使用总结
459 0
|
Java Maven Android开发
android之gradle配置仓库与引入依赖
android之gradle配置仓库与引入依赖
639 0
gradle依赖冲突的解决方式
gradle依赖冲突的解决方式
142 0
|
Java 数据库连接 API
Gradle依赖管理:编译时和运行时依赖的区别
Gradle依赖管理:编译时和运行时依赖的区别
118 0
|
缓存 Java API
Gradle 构建工具 #5 又冲突了!如何理解依赖冲突与版本决议?
Gradle 作为官方主推的构建系统,目前已经深度应用于 Android 的多个技术体系中,例如组件化开发、产物构建、单元测试等。可见,要成为 Android 高级工程师 Gradle 是必须掌握的知识点。
236 0
Gradle 构建工具 #5 又冲突了!如何理解依赖冲突与版本决议?
|
Java Maven Android开发
android studio 离线配置 gradle和依赖
android studio 离线配置 gradle和依赖
738 0