Gradle中 Implementation 与API 声明依赖方式的对比

在Gradle中,implementationapi是声明依赖的两种方式,它们在如何暴露依赖关系方面有所不同:

  • Implementation: 当一个模块使用implementation声明依赖时,该依赖仅对声明它的模块可见。这意味着该依赖对于该模块的消费者是隐藏的。因此,使用implementation可以提高构建速度,因为更改依赖项不会强制消费者重新编译。

  • API: 相反,当使用api声明依赖时,这个依赖同时被暴露给该模块的消费者。如果一个模块的公共API在其接口中暴露了第三方库的类或接口,那么这个依赖应该使用api声明。这样做的缺点是,更改api依赖将导致依赖于该模块的所有消费者都需要重新编译。

选择使用implementation还是api取决于你是否想将依赖项暴露给其他依赖于你的模块的模块。


我为测试创建了两个项目:

  • 项目A 是一个名为“frameworks-web-gradle-plugin”的Java库项目,依赖于“org.springframework.boot:spring-boot-gradle-plugin:1.5.20.RELEASE”。
  • 项目B 通过“implementation 'com.example.frameworks.gradle:frameworks-web-gradle-plugin:0.0.1-SNAPSHOT'”依赖于项目A。

    上述依赖关系层次结构看起来像这样:[project-b] -> [project-a] -> [spring-boot-gradle-plugin]

然后我测试了以下场景:

  1. 使项目A通过implementation依赖于“org.springframework.boot:spring-boot-gradle-plugin:1.5.20.RELEASE”。

    在项目B根目录中使用终端运行gradle dependencies命令,通过输出的截图我们可以看到“spring-boot-gradle-plugin”出现在runtimeClasspath依赖树中,但不在compileClasspath中。我认为这正是我们不能在B中使用由A中implementation方式声明的依赖spring-boot-gradle-plugin的原因,因为compileClasspath中没有spring-boot-gradle-plugin,代码不会通过编译。

  2. 这次修改为使项目A通过api依赖于“org.springframework.boot:spring-boot-gradle-plugin:1.5.20.RELEASE”。

    再次在项目B根目录中的终端运行gradle dependencies命令。现在“spring-boot-gradle-plugin”同时出现在compileClasspath和runtimeClasspath依赖树中。

可以看到的一个显著差异,在生产者/库项目中用implementation方式声明的依赖不会出现在消费者项目的compileClasspath中,因此我们不能在消费者项目中使用相应的库。

更多参考: StackOverflow: Gradle Implementation vs API configuration

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/261914.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

回归预测 | MATLAB实现GWO-DHKELM基于灰狼算法优化深度混合核极限学习机的数据回归预测 (多指标,多图)

回归预测 | MATLAB实现GWO-DHKELM基于灰狼算法优化深度混合核极限学习机的数据回归预测 (多指标,多图) 目录 回归预测 | MATLAB实现GWO-DHKELM基于灰狼算法优化深度混合核极限学习机的数据回归预测 (多指标,多图&#…

如何通过ssh管道传输文件到ubuntu

📑Linux/Ubuntu 常用命令归类整理 如何在window系统中,通过ssh将指定的文件传输到ubuntu中呢? 比较常用的有以下种方式: 共享文件夹借助工具, FileZillaMobaxtermWinSCPXshell XFTP samba互传PuTTY pscp 今天主要…

【Mode Management】CanSM详细介绍

1. Introduction and functional overview AUTOSAR BSW栈为每个通信总线指定一个总线特定的状态管理器。CANSM实现CAN总线的数据流控制。CanSM隶属于通信服务层。CanSM和通信硬件抽象层以及系统服务层交互。 CanSM只用用于控制CAN通信。CanSM的任务就是操作CanIf模块去控制一个…

Python中abstractmethod的使用教程

更多资料获取 📚 个人网站:ipengtao.com 在Python中,抽象类和抽象方法提供了一种强制子类实现特定方法的机制。abstractmethod是abc(Abstract Base Classes)模块中的一部分,它允许定义抽象方法&#xff0c…

阿赵UE学习笔记——3、常用界面窗口

阿赵UE学习笔记目录 大家好,我是阿赵。继续学习虚幻引擎,这次介绍的是编辑器的常用界面窗口。 一、视口 这个视口的概念,可以体现出UE对于多屏幕同时显示是多么的友好。我们开发游戏的时候,一般都会同一台电脑用2个或者以上显示器…

Docker的安装和使用

目录 安装Docker 安装yum工具 更新本地镜像源 安装docker 启动docker 关闭防火墙 docker启动命令 配置镜像加速 docker的使用 拉取nginx 查看本地镜像 把镜像文件nginx导出成tar文件 查看是否导出成功 ​编辑 删除本地镜像nginx:latest 导入镜像文件nginx 拉取…

算法基础之快速幂求逆元

快速幂求逆元 核心思想&#xff1a; 逆元&#xff1a; 逆元 ap-2 mod p #include<iostream>#include<algorithm>using namespace std;typedef long long LL;LL pmi(int a,int b,int c){LL res 1;while(b){if(b & 1) res res * a %c;b >> 1;a (LL)…

java定义三套场景接口方案

一、背景 在前后端分离开发的背景下&#xff0c;后端java开发人员现在只需要编写接口接口。特别是使用微服务开发的接口。resful风格接口。那么一般后端接口被调用有下面三种场景。一、不需要用户登录的接口调用&#xff0c;第二、后端管理系统接口调用&#xff08;需要账号密…

基于vue与three.js,监听FPX(Stats类使用)

第一步&#xff0c;引入stats类并new出来 import Stats from three/examples/jsm/libs/stats.module.js; data(){return {stats : new Stats(),} } 第二步&#xff0c;添加dom mounted() {this.init3D();this.animate();window.addEventListener("keydown", this.…

Android 自动化测试——Monkey测试

Android自带了很多方便的测试工具和方法&#xff0c;包括我们常用的单元测试、Robotium测试、Monkey测试、MonkeyRunner测试、senevent模拟等。这些方法对于我们编写高质量的APP十分有用。也可以提前暴露我们程序的隐藏问题。今天给大家讲一下Monkey测试&#xff0c;Monkey测试…

Java中的时间日期类⭐️通过具体案例分析下开发中常用到的几种时间日期格式类的使用

小伙伴们大家好&#xff0c;系统中不少模块都要用到时间日期&#xff0c;来分析总结下项目中用到的些日期类 目录 一、时间日期类 1.java.util.Calendar&#xff1a; 2.java.util.Date&#xff1a; 3.java.time.LocalDate、java.time.LocalTime、java.time.LocalDateTime&…

[Encryptedd@mailfence.com].faust 勒索病毒肆虐:如何恢复被加密的数据文件?

导言&#xff1a; 在网络安全的战场上&#xff0c;[backupsairmail.cc].faust [Deciphermailfence.com].faust[Encrypteddmailfence.com].faust[support2022cock.li].faust [tsai.shenmailfence.com].faust勒索病毒是一种极具破坏性的恶意软件。本文91数据恢复将深入介绍该病毒…

HarmonyOS引导页登陆页以及tabbar的代码说明1

效果 以下代码是东拼西凑出来的。只是为了个人熟悉一下相关模块的使用&#xff1a; 用的知识点&#xff1a; Resouces 此部分分内容可以在项目中找到&#xff1a; resources/base/element/color.json 为项目着色配置&#xff0c;当然也可以正接在代码里写 float.json 为相关…

openGuass:极简版安装

目录 一、openGauss简介 二、初始化安装环境 1.创建安装用户 2.修改文件句柄设置 ​3.修改SEM内核参数 4.关闭防火墙 6.禁用SELINUX 7.安装依赖软件 8.重启服务器 三、安装数据库 1.下载安装包 2.创建安装目录 3.解压安装包 4.执行安装 5.验证安装 四、gsql工具…

压力测试详解

压力测试 压力测试是看当前软硬件环境下系统所能承受的最大负荷&#xff0c;找出系统瓶颈。为了在线上的处理能力和稳定性维持在一个标准范围内&#xff0c;做到心中有数。 在压力测试&#xff0c;我们希望找到其他测试方法&#xff08;单元测试&#xff09;更难发现的错误&a…

《每天一分钟学习C语言·五》

1、 给一个字符数组输入字符串 char arr[10]; gets[arr]; //gets函数接收回车符&#xff0c;如果直接按回车&#xff0c;gets函数会把回车符转变成空字符作为结束&#xff0c;即arr[0]’\0’;2、 文件结尾标志ctrlz表示返回NULL 自己定义的头文件里面一般有宏定义和声明&#…

Linux目录和文件管理

一.Linux目录结构 Linux操作系统在定位文件或目录位置时&#xff0c;使用斜杠“ / ”进行分割&#xff08;区别于Windows操作系统中的反斜杠“ \ ”&#xff09;。整个树形目录结构中&#xff0c;使用独立的一个" / "表示根目录&#xff0c;根目录是Linux操作系统文…

MySQL:通过官方mysql server,搭建绿色版mysql服务器(Windows)

1. 官网下载mysql server 下载mysql server的zip文件&#xff0c;地址&#xff1a; https://downloads.mysql.com/archives/community/ 解压后 2. 初始化数据库 运行cmd&#xff0c; 进入bin目录&#xff0c;运行 mysqld --initialize-insecureinitialize-insecure说明如…

【Qt之Quick模块】3. QML类型

概述 Qt QML模块为使用QML语言开发应用程序和库提供了一个框架。它定义并实现了语言和引擎基础结构&#xff0c;并提供了一个API&#xff0c;使应用程序开发人员能够使用自定义类型扩展QML语言&#xff0c;并将QML代码与JavaScript和c集成在一起。Qt QML模块提供了QML API和c …

python用什么软件编写程序,python编写的软件有哪些

大家好&#xff0c;本文将围绕python用什么软件编写程序展开说明&#xff0c;python编写的软件有哪些是一个很多人都想弄明白的事情&#xff0c;想搞清楚用什么软件编写python需要先了解以下几个事情。 大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python可以用什么…