Gradle中的依赖Dependencies说明与使用总结

【1】依赖的方式

Gradle 中的依赖分别为直接依赖,项目依赖,本地jar 依赖。

dependencies {//①.依赖当前项目下的某个模块[子工程]implementation project(':subject01')//②.直接依赖本地的某个jar文件implementation files('libs/foo.jar', 'libs/bar.jar')//②.配置某文件夹作为依赖项implementation fileTree(dir: 'libs', include: ['*.jar'])//③.直接依赖implementation 'org.apache.logging.log4j:log4j:2.17.2'
}

① 直接依赖

在项目中直接导入的依赖,就是直接依赖

implementation 'org.apache.logging.log4j:log4j:2.17.2'

上面是简写法,完整版写法如下:

implementation group: 'org.apache.logging.log4j', name: 'log4j', version: '2.17.2'

group/name/version 共同定位一个远程仓库,version 最好写一个固定的版本号,以防构建出问题。

implementation 类似maven 中的依赖的。对比maven 中的依赖:

<dependencies><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version><scope>compile</scope></dependency>
</dependencies>

② 项目依赖

从项目的某个模块依赖另一个模块。

implementation project(':subject01')

这种依赖方式是直接依赖本工程中的libary module,这个libary module 需要在setting.gradle 中配置。

③ 本地jar 依赖

本地jar 文件依赖,一般包含以下两种方式:

//直接依赖某文件
implementation files('libs/foo.jar', 'libs/bar.jar')
//配置某文件夹作为依赖项
implementation fileTree(dir: 'libs', include: ['*.jar'])

当执行build 命令时,gradle 就会去配置的依赖仓库中下载对应的Jar,并应用到项目。

【2】依赖的类型

类似于Maven 的scope 标签,gradle 也提供了依赖的类型。

类型说明
compileOnly由java插件提供,曾短暂的叫provided,后续版本已经改成了compileOnly,适用于编译期需要而不需要打包的情况
runtimeOnly由java 插件提供,只在运行期有效,编译时不需要,比如mysql 驱动包。,取代老版本中被移除的runtime
implementation由java 插件提供,针对源码[src/main 目录] ,在编译、运行时都有效,取代老版本中被移除的compile
testCompileOnly由java 插件提供,用于编译测试的依赖项,运行时不需要
testRuntimeOnly由java 插件提供,只在测试运行时需要,而不是在测试编译时需要,取代老版本中被移除的testRuntime
testImplementation由java 插件提供,针对测试代码[src/test 目录] 取代老版本中被移除的testCompile
providedCompilewar 插件提供支持,编译、测试阶段代码需要依赖此类jar 包,而运行阶段容器已经提供了相应的支持,所以无需将这些文件打入到war 包中了;例如servlet-api.jar、jsp-api.jar
compile编译范围依赖在所有的classpath 中可用,同时它们也会被打包。在gradle 7.0 已经移除
runtimeruntime 依赖在运行和测试系统的时候需要,在编译的时候不需要,比如mysql 驱动包。在gradle 7.0 已经移除
apijava-library 插件提供支持,这些依赖项可以传递性地导出给使用者,用于编译时和运行时。取代老版本中被移除的compile
compileOnlyApijava-library 插件提供支持,在声明模块和使用者在编译时需要的依赖项,但在运行时不需要。

官方文档参考:

https://docs.gradle.org/current/userguide/java_library_plugin.html#java_library_plugin: 各个依赖范围的关系和说明

https://docs.gradle.org/current/userguide/upgrading_version_6.html#sec:configuration_removal : 依赖范围升级和移除

https://docs.gradle.org/current/userguide/java_library_plugin.html#java_library_plugin:API 和implemention 区别

https://docs.gradle.org/current/userguide/java_plugin.html#java_plugin: 执行java 命令时都使用了哪些依赖范围的依赖。

需要说明的是,java 插件提供的功能,java-library 插件都提供。

【3】api 与implementation 区别

apiimplementation
编译时能进行依赖传递,底层变,全部都要变、编译速度慢不能进行依赖传递,底层变不用全部都要变,编译速度快
运行时运行时加载,所有模块的class都要被加载运行时加载,所有模块的class都要被加载
应用场景适用于多模块依赖,避免重复依赖模块多数场景下使用

在这里插入图片描述
对api来讲

编译时:如果libC 的内容发生变化,由于使用的是api 依赖,依赖会传递,所以libC、libA、projectX 都要发生变化,都需要重新编译,速度慢。
运行时:libC、libA、projectX 中的class 都要被加载。

对implementation 来讲

编译时:如果libD 的内容发生变化,由于使用的是implemetation 依赖,依赖不会传递,只有libD、libB 要变化并重新编译,速度快。
运行时:libC、libA、projectX 中的class 都要被加载。

api 的适用场景是多module 依赖。moduleA 工程依赖了module B,同时module B 又需要依赖了module C,modelA 工程也需要去依赖module C,这个时候避免重复依赖module,可以使用module B api 依赖的方式去依赖module C,modelA 工程只需要依赖moduleB 即可。

在这里插入图片描述

总之,除非涉及到多模块依赖,为了避免重复依赖,咱们会使用api,其它情况我们优先选择implementation,拥有大量的api 依赖项会显著增加构建时间。

【4】依赖冲突解决

依赖冲突是指"在编译过程中, 如果存在某个依赖的多个版本, 构建系统应该选择哪个进行构建的问题"。

默认下,Gradle 会使用最新版本的jar 包【考虑到新版本的jar 包一般都是向下兼容的】,实际开发中,还是建议使用官方自带的这种解决方案。当然除此之外,Gradle 也为我们提供了一系列的解决依赖冲突的方法: exclude移除一个依赖,不允许依赖传递,强制使用某个版本。

① exclude移除一个依赖

dependencies {testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'implementation('org.hibernate:hibernate-core:3.6.3.Final'){//排除某一个库(slf4j)依赖:如下三种写法都行exclude group: 'org.slf4j'exclude module: 'slf4j-api'exclude group: 'org.slf4j',module: 'slf4j-api'}//排除之后,使用手动的引入即可。implementation 'org.slf4j:slf4j-api:1.4.0'
}

② 不允许依赖传递

dependencies {testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'implementation('org.hibernate:hibernate-core:3.6.3.Final'){//不允许依赖传递,一般不用transitive(false)}//排除之后,使用手动的引入即可implementation 'org.slf4j:slf4j-api:1.4.0'
}

在添加依赖项时,如果设置transitive 为false,表示关闭依赖传递。即内部的所有依赖将不会添加到编译和运行时的类路径。

③ 强制使用某个版本

dependencies {testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'implementation('org.hibernate:hibernate-core:3.6.3.Final')//强制使用某个版本!!【官方建议使用这种方式】implementation('org.slf4j:slf4j-api:1.4.0!!')//这种效果和上面那种一样,强制指定某个版本implementation('org.slf4j:slf4j-api:1.4.0'){version{strictly("1.4.0")}}
}

我们可以先查看当前项目中到底有哪些依赖冲突:

/下面我们配置,当Gradle 构建遇到依赖冲突时,就立即构建失败
configurations.all() {Configuration configuration ->//当遇到版本冲突时直接构建失败configuration.resolutionStrategy.failOnVersionConflict()
}

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

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

相关文章

行业安卓主板-基于RK3568/3288/3588的电子班牌/人脸识别门禁/室内对讲门禁方案解决方案(二)

电子班牌 智能电子班牌可在主页实时显示班级全面的基本信息&#xff0c;包括天气、班名、课程表、值日表等&#xff0c;并发布学校通知、班级通知。学生可刷卡自动登陆系统进行课堂反馈&#xff0c;教师和家长可及时了解教学反馈&#xff0c;打通学校、教师、学生之间的互动通…

Hive 解析 JSON 字符串数据的实现方式

文章目录 通过方法解析现实示例 通过序列化实现示例 通过方法解析现实 在 Hive 中提供了直接解析 JSON 字符串数据的方法 get_json_object(json_txt, path)&#xff0c;该方法参数解析如下&#xff1a; json_txt&#xff1a;顾名思义&#xff0c;就是 JSON 字符串&#xff1b;…

elasticsearch索引按日期拆分

1.索引拆分原因 如果单个索引数据量过大会导致搜索变慢&#xff0c;而且不方便清理历史数据。 例如日志数据每天量很大&#xff0c;而且需要定期清理以往日志数据。例如原索引为sc_all_system_log&#xff0c;现按天拆分索引sc_all_system_log20220902&#xff0c;sc_all_syste…

B-DS二叉树_输出所有目标路径

Description 给定二叉树和一个整数目标targetSum&#xff0c;输出所有从根结点到叶子结点的路径总和等于targetSun的路径。 Input 第一行输入t&#xff0c;表示有t个测试样例。 第二行起&#xff0c;每一行首先输入一个整数targetSum&#xff0c;接着输入n&#xff0c;接着输…

AMD老电脑超频及性能提升方案及实施

收拾电子元件的时候找到了若干古董的CPU 其中有一个X3 440 是原来同学主板烧了之后给我的&#xff0c;我从网上配了AM2 昂达主板&#xff0c;然后又买了AMD兼容内存&#xff0c;组成了win7 64位电脑&#xff0c;用起来非常不错&#xff0c;我把硬件配置和升级过程说明下&#x…

ELK极简上手

目录 引言 首先&#xff0c;下载相关的包 其次&#xff0c;安装启动elasticsearch 下一步&#xff0c;安装并启动logstash 最后&#xff0c;安装并启动kibana 进一步的&#xff0c;测试数据的流动 引言 最近整理电脑发现之前的一篇ELK极简入门笔记&#xff0c;现整理发出…

开发小程序需要多少钱?

随着移动互联网的快速发展&#xff0c;小程序已经成为了企业、个人创业者获取用户、提升品牌影响力的重要工具。然而&#xff0c;对于许多初次接触小程序的人来说&#xff0c;开发小程序需要多少钱&#xff0c;是他们最关心的问题。 首先我们需要明确的是&#xff0c;开发小程…

【漏洞复现】Drupal_小于7.32版本 _“Drupalgeddon” SQL注入漏洞(CVE-2014-3704)

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞扫描3、漏洞验证 说明内容漏洞编号CVE-2014-3704漏洞名称Drupal “Drupalgeddon” SQL注入漏洞漏洞…

hackergame2023菜菜WP

文章目录 总结Hackergame2023更深更暗组委会模拟器猫咪小测标题HTTP集邮册Docker for everyone惜字如金 2.0Git? Git!高频率星球低带宽星球小型大语言模型星球旅行日记3.0JSON ⊂ YAML? 总结 最近看到科大在举办CTF比赛&#xff0c;刚好我学校也有可以参加&#xff0c;就玩了…

Lamport Clock算法

Lamport Clock 是一种表达逻辑时间的逻辑时钟&#xff08;logical clock&#xff09;&#xff0c;能够计算得到历史事件的时间偏序关系。 假设 P0进程是分布式集群中心节点中的监控者&#xff0c;用于统一管理分布式系统中事件的顺序。其他进程在发送消息之前和接受事件消息之后…

路由器基础(十二):IPSEC VPN配置

一、IPSec VPN基本知识 完整的IPSec协议由加密、摘要、对称密钥交换、安全协议四个部分组成。 两台路由器要建立IPSecVPN连接&#xff0c;就需要保证各自采用加密、摘要、对称密钥 交换、安全协议的参数一致。但是IPSec协议并没有确保这些参数一致的手段。 同时&#xff0c;IP…

Java 多线程的三大特性

在JAVA中&#xff0c;线程有原子性、可见性和有序性三大特性。 1.原子性 1.1 定义 对于涉及共享变量的操作&#xff0c;若该操作从其执行线程以外的任意线程来看都是不可分割的&#xff0c;那么我们就说该操作具有原子性。它包含以下两层含义&#xff1a; 访问&#xff08;读、…

【漏洞复现】Django_debug page_XSS漏洞(CVE-2017-12794)

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞分析3、漏洞验证 说明内容漏洞编号CVE-2017-12794漏洞名称Django_debug page_XSS漏洞漏洞评级影响范…

与AI对话的艺术:如何优化Prompt以获得更好的响应反馈

前言 在当今数字化时代&#xff0c;人工智能系统已经成为我们生活的一部分。我们可以在智能助手、聊天机器人、搜索引擎等各种场合与AI进行对话。然而&#xff0c;要获得有益的回应&#xff0c;我们需要学会与AI进行有效的沟通&#xff0c;这就涉及到如何编写好的Prompt。 与…

开启AWS的ubuntu服务器的root用户登录权限

设置root用户密码 输入以下命令修改root用户密码 sudo passwd root输入以下命令切换到root用户 su root仅允许root用户用密码登录 输入以下命令编辑ssh配置文件 vi /etc/ssh/sshd_config新增以下配置允许root用户登录 PermitRootLogin yes把PasswordAuthentication修改为…

计算机网络第4章-IPv4

IPv4数据报格式 IPv4数据报格式如下图所示 其中&#xff0c;有如下的关键字段需要特别注意&#xff1a; 版本&#xff08;号&#xff09;&#xff1a; 版本字段共4比特&#xff0c;规定了数据报的IP协议版本。通过查看版本号吗&#xff0c;路由器能确定如何解释IP数据报的剩…

Python爬虫实战-批量爬取下载网易云音乐

大家好&#xff0c;我是python222小锋老师。前段时间卷了一套 Python3零基础7天入门实战https://blog.csdn.net/caoli201314/article/details/1328828131小时掌握Python操作Mysql数据库之pymysql模块技术https://blog.csdn.net/caoli201314/article/details/133199207一天掌握p…

MSF暴力破解SID和检测Oracle漏洞

暴力破解SID 当我们发现 Oracle 数据库的 1521 端口时,我们可能考虑使用爆破 SID(System Identifier)来进行进一步的探测和认证。在 Oracle 中,SID 是一个数据库的唯一标识符。当用户希望远程连接 Oracle 数据库时,需要了解以下几个要素:SID、用户名、密码以及服务器的 I…

深入理解WPF中的依赖注入和控制反转

在WPF开发中&#xff0c;依赖注入&#xff08;Dependency Injection&#xff09;和控制反转&#xff08;Inversion of Control&#xff09;是程序解耦的关键&#xff0c;在当今软件工程中占有举足轻重的地位&#xff0c;两者之间有着密不可分的联系。今天就以一个简单的小例子&…

Linux背景介绍与环境搭建

本章内容 认识 Linux, 了解 Linux 的相关背景学会如何使用云服务器掌握使用远程终端工具 xshell 登陆 Linux 服务器 Linux 背景介绍 发展史 本门课程学习Linux系统编程&#xff0c;你可能要问Linux从哪里来&#xff1f;它是怎么发展的&#xff1f;在这里简要介绍Linux的发展…