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

news2024/12/23 10:45:08

在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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第三方登录-pc支付宝扫码登录流程

最近有个奇葩的需求,用户要支持支付宝扫码登录。这个需求很少见,那就做一下,看起来有点难,其实很简单。 先看结果 流程梳理 核心代码 获取支付宝扫码页面的url // 获取支付宝扫码登录页面的urlasync function getZFBLoginUrl()…

MySQL概括与SQL分类

文章目录 一、计算机语言二、SQL语言三、数据库系统四、MySQL简介 一、计算机语言 二、SQL语言 三、数据库系统 四、MySQL简介

如何通过宝塔面板搭建一个MySQL数据库服务并实现无公网ip远程访问?

文章目录 前言1.Mysql服务安装2.创建数据库3.安装cpolar3.2 创建HTTP隧道 4.远程连接5.固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 宝塔面板的简易操作性,使得运维难度降低,简化了Linux命令行进行繁琐的配置,下面简单几步,通过宝塔面板cp…

flink sql1.18.0连接SASL_PLAINTEXT认证的kafka3.3.1

阅读此文默认读者对docker、docker-compose有一定了解。 环境 docker-compose运行了一个jobmanager、一个taskmanager和一个sql-client。 如下: version: "2.2" services:jobmanager:image: flink:1.18.0-scala_2.12container_name: jobmanagerports:…

Kafka 如何保证高可用?

Kafka 的基本架构组成是:由多个 broker 组成一个集群,每个 broker 是一个节点;当创建一个 topic 时,这个 topic 会被划分为多个 partition,每个 partition 可以存在于不同的 broker 上,每个 partition 只存…

【新姿势】SpringBoot下时间配置新方式(同文件大小)

SpringBoot Duration 背景: 在SpringBoot项目中,我们经常需要配置时间参数,作为某一动作的间隔。以往我们通常是在配置文件中定义字段后,直接设置对应的秒或毫秒值,遇到计算时,直接在此基础上做运算。这种…

标准解析|海格里斯HEGERLS四向车调度算法如何解决同层多车车辆路径规划和避让问题?

随着当前各大企业对仓储存储需求的不断攀升,仓储货架业已进入智能自动化系统集成时代,从单一的货架存储已慢慢发展为货架穿梭车提升机拣选系统控制软件仓库管理软件等集成的仓储解决方案,如四向穿梭车系统,多层穿梭车系统&#xf…

解决:OSError: cannot write mode RGBA as JPEG

解决:OSError: cannot write mode RGBA as JPEG 文章目录 解决:OSError: cannot write mode RGBA as JPEG背景报错问题报错翻译报错位置代码报错原因解决方法参考今天的分享就到此结束了 背景 在使用之前的代码时,报错: Traceback…

CodeBlocks配置WinLibs

一、准备工作 1、去Code::Blocks - Browse /Binaries/Nightlies at SourceForge.net下载CodeBlocks最新的nightly build版本,并下载wxWidget dll和Mingw64 dll库文件。 我下载的CB 13411 ,Mingw64dlls13.1.0.7z,wxmsw32u_gcc_cb_wx324_2D_g…

​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化

2022年亚马逊云科技re:Invent盛会于近日在拉斯维加斯成功召开,吸引了众多业界精英和创新者。亚马逊云科技边缘服务副总裁Jan Hofmeyr在演讲中分享了关于亚马逊云科技海外服务器边缘计算的最新发展和创新成果,引发与会者热烈关注。 re:Invent的核心主题是…

从Gitee克隆项目、启动方法

从gitee克隆VUE项目到本地后,不能直接运行,需要进行npm install安装node_modules文件夹里面的内容,因为在git上传的时候,一般都会过滤到node_modules中的依赖文件。 安装依赖以后,启动通过npm run serve启动项目出错。…

MySQL-1

1 数据库基础概念 Data数据 对客观事物的符号表示,如图形符号、数字、字母等,数据是数据库中存储的基本对象。2. DB数据库数据库(Database,简称DB)的定义:“按照数据结构来组织、存储和管理数据的仓库” 3. DBMS数据库管理系统概念&#xff…

多媒体信息化建设,动态数据中心,深入理解分布式系统

目录 一、前言二、双活数据中心三、数据备份方式四、设计双活数据中心需要考虑的问题1、延迟和稳定性2、Quorum/ Tie-Breaker3、工作负载 五、动态数据中心六、深入理解分布式系统1、内容介绍2、作者简介 大家好,我是哪吒。 文末送5本《深入理解分布式系统》 一、…

Amazon Toolkit — CodeWhisperer 使用

tFragment--> 官网:https://aws.amazon.com/cn/codewhisperer/?trkcndc-detail 最近学习了亚马逊云科技的 代码工具,感慨颇多。下面是安装 和使用的分享。 CodeWhisperer,亚马逊推出的实时 AI 编程助手,是一项基于机器学习…

Linux服务器nginx部署Vue前端(详细版)

提示:适用于前后端项目的部署 文章目录 前言一、打包前端文件二、下载和部署Nginx三、配置conf文件启动nginx 前言 搜索到这篇文章想必你已经对Nginx比较了解,我也不对Nginx进行介绍赘述了,只需要明白Nginx本身也是一个静态资源的服务器&…

【MYSQL】MYSQL 的学习教程(三)之索引核心知识点

1. 什么是索引? 索引是一种能提高数据库查询效率的数据结构,一般存储在磁盘的文件中,它是占用物理空间的 适当的索引能提高查询效率,过多的索引会影响数据库表的插入和更新功能。 2. 索引的优劣势 优势: 提高数据…

GEM5 Garent CPU cache消息传递路径:1. NI部分

简介 我们仔细分析下图怎么连的,以及消息传递路径。 图来自https://www.gem5.org/documentation/general_docs/ruby/ 代码的连接 fs.py->ruby.py-> gem5/configs/ruby/MESI_Two_Level.py 中的 create_system( options, full_system, system, dma_ports, b…

STM32单片机项目实例:基于TouchGFX的智能手表设计(7)MVP架构下的交互逻辑设计

STM32单片机项目实例:基于TouchGFX的智能手表设计(7)MVP架构下的交互逻辑设计 目录 一、概述 二、MVP架构下的交互逻辑 一、概述 本文例程是基于 TouchGFX 的智能手表设计—Designer 软件 UI 设计的例程 0B-2_STM32U575_MVP_Interactive工…

【点选验证码识别】某招标网站反爬虫分析与验证码自动识别

文章目录 1. 写在前面2. 风控描述3. 验证码裁剪4. 验证码识别 【作者主页】:吴秋霖 【作者介绍】:Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作! 【作者推荐】:对JS逆向感兴趣…

Redis基础篇-002 初识Redis

1、认识NoSQL 1.1 概念 NoSQL是一个非关系型数据库。 常见的NoSQL有:Redis、MongoDB 1.2 NoSQL与SQL的区别 类别SQLNoSQL数据结构结构化非结构化数据关联关联非关联查询方式SQL非SQL事务特性ACIDBASE存储方式磁盘内存扩展性垂直水平使用场景1)数据结…