Java用 Gradle配置compile及implementation和api的区别

 更新时间:2022年06月08日 09:31:58   作者:禅与计算机程序设计艺术  
这篇文章主要介绍了Java用Gradle配置compile及implementation和api的区别,文章围绕主题的相关资料展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下

前言:

这个主要看Java项目所使用的Gradle的版本。

Gradle 3.4 新增了Java-library插件,java-library插件使用了新的依赖配置implementation和api。旧的依赖配置compile被废弃。

Gradle 3.4 之前的版本

java插件:

apply plugin: 'java'

添加依赖:

dependencies {
compile 'commons-httpclient:commons-httpclient:3.1'
compile 'org.apache.commons:commons-lang3:3.5'
}

Gradle 3.4+

使用java-library插件替换java插件

apply plugin: 'java-library'

新的依赖配置:implementation和api

dependencies {
api 'commons-httpclient:commons-httpclient:3.1'
implementation 'org.apache.commons:commons-lang3:3.5'
}

api和implementation两种依赖的不同点在于:它们声明的依赖其他模块是否能使用。

api:当其他模块依赖于此模块时,此模块使用api声明的依赖包是可以被其他模块使用。

implementation:当其他模块依赖此模块时,此模块使用implementation声明的依赖包只限于模块内部使用,不允许其他模块使用。

api: 跟 2.x 版本的 compile完全相同

implementation:使用了该命令编译的依赖,它仅仅对当前的Module提供接口。例如我们当前项目结构如下

LibraryA 中引用了 LibraryC 的库,如果对 LibraryC 的依赖用的是 implementation 关键字。 如下:

dependencies {
. . . .
implementation project(path:':libraryC')
}

那么LibraryC 中的接口,仅仅只能给 LibraryA 使用,而我们的 App Module 是无法访问到 LibraryC 提供的接口的,也就是将该依赖隐藏在内部,而不对外部公开。这就是implementation关键字的作用。

最佳实践建议

在Google IO 相关话题的中提到了一个建议,就是依赖首先应该设置为implement的,如果没有错,那就用implement,如果有错,那么使用api指令,这样会使编译速度有所增快。

那为什么要这么做呢?

答案是: 1. 加快编译速度。2. 隐藏对外不必要的接口。

为什么能加快编译速度呢?

这对于大型项目含有多个Module模块的, 以上图为例,比如我们改动 LibraryC 接口的相关代码,这时候编译只需要单独编译LibraryA模块就行, 如果使用的是api或者旧时代的compile,由于App Module 也可以访问到 LibraryC,所以 App Module部分也需要重新编译。当然这是在全编的情况下。

版本依赖关键字详解(2.0与3.0所有关键字)

compile(api)

这种是我们最常用的方式,使用该方式依赖的库将会参与编译和打包。
当我们依赖一些第三方的库时,可能会遇到com.android.support冲突的问题,就是因为开发者使用的compile依赖的com.android.support包,而他所依赖的包与我们本地所依赖的com.android.support包版本不一样,所以就会报All com.android.support libraries must use the exact same version specification (mixing versions can lead to runtime crashes这个错误。

provided(compileOnly)

只在编译时有效,不会参与打包
可以在自己的module中使用该方式依赖一些比如com.android.support,gson这些使用者常用的库,避免冲突。

apk(runtimeOnly)

只在生成apk的时候参与打包,编译时不会参与,很少用。

testCompile(testImplementation)

testCompile 只在单元测试代码的编译以及最终打包测试apk时有效。

debugCompile(debugImplementation)

debugCompile 只在 debug 模式的编译和最终的 debug apk 打包时有效

releaseCompile(releaseImplementation)

Release compile仅仅针对 Release 模式的编译和最终的 Release apk 打包。

到此这篇关于Java用 Gradle配置compile及implementation和api的区别的文章就介绍到这了,更多相关Java 配置compile 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于springboot的RestTemplate、okhttp和HttpClient对比分析

    基于springboot的RestTemplate、okhttp和HttpClient对比分析

    这篇文章主要介绍了基于springboot的RestTemplate、okhttp和HttpClient对比分析,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • Java对zip,rar,7z文件带密码解压实例详解

    Java对zip,rar,7z文件带密码解压实例详解

    在日常业务中,会遇到一些琐碎文件需要打包到一个压缩包中上传,业务方在后台接收到压缩包后自行解压,然后解析相应文件。而且可能涉及安全保密,因此会在压缩时带上密码,要求后台业务可以指定密码进行解压。本文将用Java解决这一问题,需要的可以参考一下
    2022-07-07
  • 基于Jpa中ManyToMany和OneToMany的双向控制

    基于Jpa中ManyToMany和OneToMany的双向控制

    这篇文章主要介绍了Jpa中ManyToMany和OneToMany的双向控制,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Java实现的时间戳与date对象相互转换功能示例

    Java实现的时间戳与date对象相互转换功能示例

    这篇文章主要介绍了Java实现的时间戳与date对象相互转换功能,结合具体实例形式分析了java日期与时间戳类型的表示与转换相关操作技巧,需要的朋友可以参考下
    2017-06-06
  • java实现多人聊天工具(socket+多线程)

    java实现多人聊天工具(socket+多线程)

    这篇文章主要为大家详细介绍了java实现多人聊天工具,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • SpringBoot项目实战之加载和读取资源文件

    SpringBoot项目实战之加载和读取资源文件

    在项目的开发中,我们知道的是SpringBoot框架大大减少了我们的配置文件,但是还是留下了一个application.properties文件让我们可以进行一些配置,下面这篇文章主要给大家介绍了关于SpringBoot项目实战之加载和读取资源文件的相关资料,需要的朋友可以参考下
    2021-10-10
  • Mybatis-plus支持Gbase8s分页的实现示例

    Mybatis-plus支持Gbase8s分页的实现示例

    本文主要介绍了Mybatis-plus支持Gbase8s分页的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Spring如何解决单例bean线程不安全的问题

    Spring如何解决单例bean线程不安全的问题

    这篇文章主要介绍了Spring如何解决单例bean线程不安全的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Maven下载依赖的顺序及配置文件小结

    Maven下载依赖的顺序及配置文件小结

    本文主要介绍了Maven下载依赖的顺序及配置文件小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • 关于Java如何正确地实现方法重载详解

    关于Java如何正确地实现方法重载详解

    在一个类中,可以定义多个构造方法,这叫做方法的重载!但是关于方法重载,具有有哪些要求和细节?在今天的这篇文章中,小编给大家详细说说方法重载相关的内容,需要的朋友可以参考下
    2023-05-05

最新评论