Gradle笔记 六 Gradle 中的Dependencies

史上最全Android-build-gradle配置详解(1),实现原理讲解 链图片转存中…(img-YVAD9eHW-1710935505552)][外链图片转存中…(img-Q170pc9X-1710935505552)] 阅读详情

Dependencies

依赖的方式

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 中的依赖的scope,对比 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,并应用到项目中。

依赖的类型

类似于 Maven 的 scope 标签,gradle 也提供了依赖的类型,具体如下所示:

scope作用
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 插件提供支持,在声明模块和使用者在编译时需要的依赖项,但在运行时不需要。

api 与implementation 区别

请添加图片描述

如下所示:

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

依赖冲突及解决方案

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

请添加图片描述

A、B、C 都是本地子项目 module,log4j 是远程依赖。
编译时: B 用 1.4.2 版本的 log4j,C 用 2.2.4 版本的 log4j,B 和 C 之间没有冲突
打包时: 只能有一个版本的代码最终打包进最终的A对应的jar |war包,对于 Gradle 来说这里就有冲突了

案例演示:我们在 build.gradle 引入依赖库

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'
}

请添加图片描述

修 改 build.gradle

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'
}

请添加图片描述

如上所示:默认下,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()
}
Gradle 依赖管理基础 Android Studio中,除了上述定义的配置项外,还有implementation、testImplementation、androidTestImplementation等,这些应该就是Android Studio中自定义的配置项。外部依赖包含 group,name 和 version 几个属性。根据选取仓库的不同,group 和 version 也可能是可选的。当然,也有一种更加简洁的方式来声明外部依赖。采用:将三个属性拼接在一起即可。 阅读详情

相关推荐

build.gradle内dependencies:关于依赖库包含目录Repositories

【代码】build.gradle内dependencies:关于依赖库包含目录Repositories。

1262

gradle构建脚本(build script)基础 dependencies classpath 与dependencies的区别

项目并不一定代表要构建的东西。尽管如此,为了让你了解什么是任务,我们将在本章中讨论如何在一个项目的构建中定义一些简单的任务。如果构建脚本需要使用外部库,可以将它们添加到构建脚本本身的脚本类路径中。您可以使用buildscript()方法,传入一个声明构建脚本类路径的块。声明了构建脚本类路径后,您可以像使用类路径上的任何其他类一样使用构建脚本中的类。下面的示例添加到前面的示例,并使用来自构建脚本类路径的类。对于多项目构建,使用项目的buildscript()方法声明的依赖关系可用于其所有子项目的构建脚本。

superzhang6666的博客 3755

Android中compile,implementation和api的区别,以及gradle-wrapper的详解

如果你已经有被wrap的gradle,那么就使用已经有的,如果没有就下载下来进行使用。:项目变小了,只需要指定需要版本的gradle,不需要将gradle放进项目里面,如果其他人要使用该项目,只需要使用使用其他人电脑上面的gradle即可,如果没有下载下来使用。重要:当我们使用了传递依赖compile,0级项目依赖了1级项目,1级项目依赖了2级项目,2级项目代码的改动,会导致0级项目重新编译。那么就是A能使用C中的类。不进行传递依赖,2级项目代码的改动,不会导致0级项目编译,这样项目打包的总时间会变快。

路宇的博客 3068

【gradle】从 settings.gradle说起

在搭建好 spring 5 源码后,在自己编写测试用例和添加测试 module 时,会遇到一些配置报错信息,由于不了解 gradle 配置文件的语法和含义,产生了一些困扰,因此在这里学习一下 gradle 一些配置文件语法。记录了一些在尝试建立测试模块中不了解的内容,之后在看源码的过程中遇到问题再补充吧…

Yes_water的博客 3362

基于Ollama本地大模型的Python自动化翻译工具开发实践

本文详细介绍了如何利用Ollama本地大模型和Python开发自动化批量翻译工具。通过部署本地开源模型、设计精准提示词、处理长文本分割及多种文档格式,构建了一个兼顾隐私安全、可控性与成本效益的翻译流水线,有效解决了文档批量翻译的痛点。

yhn45678901的博客 560

如何在SendWS实现WhatsApp批量群发设置管理?WhatsApp群发超链有什么好处?

WhatsApp群发顾名思义就是对WhatsApp上的用户好友进行群发消息,给他们群发想要发送的消息。及时不认识对方也可以对他进行群发超链。越来越多做跨境出海运营的工作者利用WhatsApp进行营销推广,因为他能做到低成本高回报,向客户发送消息曝光自己的品牌或产品,使得更多人了解,拓展新客户,提高成交率。

SendWS-WS云控群控拓客聊天翻译 1172

Gradle dependencies 解决项目依赖冲突

当我们的项目依赖存在冲突时,如何排查jar冲突呢? 在控制台输入:gradle dependencies --configuration default 查看当前项目jar依赖树; 查看子模块dependencies 依赖树:gradle dependencies mymodel:dependencies --configuration default;将mymodel 替换成自己的项目名称,查...

以后的今天的博客 4334

实战复盘:如何用Frida脚本绕过某书APP的libmsaoaidsec.so检测(附完整Hook代码)

本文深入探讨了如何利用Frida脚本绕过某书APP通过libmsaoaidsec.so实现的反Frida检测机制。通过分析动态链接过程中的关键节点和检测模式,提供了两种实战验证的绕过方案:动态Hook关键链接器函数和静态Patch SO文件。文章还分享了进阶对抗策略和调试技巧,帮助安全研究人员有效应对现代移动安全防护挑战。

weixin_42706667的博客 219

Gradle打包生成dependencies.xml详解

在 Gradle 打包时生成 文件,可以通过创建一个自定义的 Gradle 任务来实现。该任务的核心是收集项目的依赖信息,并将其以 XML 格式写入文件。以下是两种主流方案:Gradle 内置了生成依赖报告的功能,我们可以配置一个自定义任务来生成 XML 格式的报告。在 中添加自定义任务: 执行任务:如果你的项目同时支持 Maven,或者你需要与 Maven 格式完全兼容的 ,可以使用 插件。应用 Maven 插件并添加自定义任务: 方案对比 特性

mxskymx的专栏 420

SLAM工程师面试避坑指南:2025年最新高频考点与实战代码解析

本文为SLAM工程师提供2025年最新面试避坑指南,涵盖高频技术考点如VINS初始化、三维几何处理、多传感器融合架构设计等,并包含实战代码解析。特别针对算法工程师面试中的常见陷阱,提供系统设计框架和代码模板,帮助求职者提升通过率。

metaverse5vr的博客 246

基于YOLOv8n的FPGA无PS端PL部署完整实现方案

本文提出了一种将YOLOv8n目标检测模型完整部署到FPGA纯PL端的实现方案。通过PyTorch训练和INT8量化技术,结合Vitis AI工具链,将模型转换为适合FPGA实现的硬件描述。方案详细阐述了从模型训练、量化校准到FPGA硬件设计的全流程,重点解决了无PS端部署的架构设计、资源优化和实时性保障等关键技术挑战。实验结果表明,该方案在Xilinx Virtex-690T FPGA上实现了30FPS以上的实时目标检测性能,为边缘计算场景提供了高效的硬件加速解决方案。

huanghm88的专栏 509

Gradle 的Dependencies

Gradle 中的依赖分别为 直接依赖,项目依赖,本地 jar 依赖 直接依赖: 在项目中直接导入的依赖,就是直接依赖 上面是简写法,完整版写法如下: 共同定位一个远程仓库,version 最好写一个固定的版本号,以防构建出问题,implementation 类似 maven 中的依赖的 scope,对比 maven 中的依赖: 项目依赖: 从项目的某个模块依赖另一个模块这种依赖方式是直接依赖本工程中的 libary module,这个 libary module 需要在 setting.gradle 中

Lifelong learning 8542

【100%通过率】华为OD机试真题 Python 实现【水库蓄水问题】【2022.11 Q4 新题】

给定一个长度为 n 的整数数组height。数组的元素表示山的高度,选择两个元素作为水库的边界,求蓄水量的最大值并输出蓄水量最大时的边界下标(蓄水量相同时输出下标较近的)。

MISAYAONE的博客 1万+

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

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

小小默:进无止境 9892

基于simulink的软开关技术的三相逆变器仿真

三相逆变器中的软开关技术(Soft Switching Techniques)旨在减少开关损耗,提高效率,并降低电磁干扰(EMI)。实现软开关通常涉及使用谐振电路或准谐振电路来确保开关器件在零电压(Zero Voltage Switching, ZVS)或零电流(Zero Current Switching, ZCS)条件下进行切换。下面将详细介绍如何在Simulink中进行基于软开关技术的三相逆变器仿真设计。

xiaoheshang_123的博客 164

Altium Designer应用技巧1: 功能模块的复用方法

Altium Designer应用技巧1: 功能模块的复用方法      我们在使用Altium Designer进行电路图设计时,常会遇到功能模块的复用问题,例如我们经常需要将12V以DC-DC的方式转换成5V,这在很多线路板上都会应用到。现在我们普通的做法是,每个板子都重新绘制一遍,像这样DC-DC的电路,很浪费时间。那么如何采用提高工作效率呢?我们可以采取Altium Desi

snmplink的博客 1万+

【Android Gradle 插件】Gradle 依赖管理 ② ( build.gradle 中的 dependencies 依赖配置 | DependencyHandler#add 方法介绍 )

一、build.gradle 中的 dependencies 依赖配置、 二、DependencyHandler#add 方法介绍

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 3107

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Gradle 进阶学习之 Dependencies 【依赖】

在Gradle中,依赖管理是一个非常重要的部分,它允许你指定项目所需的各种库和模块。你的案例中提到了三种常见的依赖类型:项目依赖、本地JAR依赖和远程仓库的直接依赖。下面我将分别解释这三种依赖类型,并提供相应的配置方法。

一切总会归于平淡 5835

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Gradle Dependencies Helper Plugin 使用教程

Gradle Dependencies Helper Plugin 使用教程 本教程将引导您了解并使用 Gradle Dependencies Helper Plugin,这是一个旨在简化Gradle构建中依赖管理的开源工具。通过这个插件,您可以更高效地处理项目依赖关系。下面我们将依次介绍项目的目录结构、启动文件以及配置文件。 1. 项目的目录结构及介绍 GradleDependenciesHel...

gitblog_00029的博客 1089

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

学习笔记 - Gradle依赖管理 Gradle Dependencies

TODO: 待补充 官方文档:https://docs.gradle.org/current/userguide/core_dependency_management.html 1. Overview of Gradle.build access artifactsaccess artifactsstore artifactsGradle Buildlocal file repositoryNet...

creepcheck的博客 4082

build gradle dependencies闭包的详解

dependencies闭包的整体功能是指定当前项目所有依赖关系:本地依赖、库依赖及远程依赖。 本地依赖:可以对本地Jar包或者目录添加依赖关系 库依赖:可以对项目中的库模块添加依赖关系 远程依赖:可以对jcenter库上的开源项目添加依赖,标准的远程依赖格式是:域名:组织名:版本号 dependencies { 181 implementation fileTree(dir: ...

guanguanboy的专栏 3649

【Android studio】【Gradle】dependencies配置参数细解及异常解决

build.gradle配置中也许会有的疑惑。这里有答案

产品:SmartApi;服务:大前端++;其他技术分享 7210

Gradle的使用——dependencies的使用说明

Gradle的使用——dependencies的使用说明 简介 Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。Gradle 构建脚本使用的是 Groovy 或 Kotlin 的特定领域语言来编写的,而不是传统的XML。 Gradle.png 简述 在使用gradle时我们常常需要根据不同的情况引入不同的包,对此官方提供了dependen...

CN華少的博客 1973

Gradle新手必看:build.gradle文件中的plugins、repositories、dependencies标签全解析

本文详细解析了Gradle构建脚本中plugins、repositories和dependencies三大核心标签的作用与配置方法。通过对比Maven XML配置,阐述了Gradle DSL的优势,并提供了插件管理、仓库选择、依赖声明及版本控制的最佳实践,帮助开发者快速掌握build.gradle文件的编写,提升项目构建效率与可维护性。

grafana8visual的博客 557

Android Gradle(五)dependencies节点配置

安卓Gradle中dependencies的配置属性详解

写好每一篇文章 3167

IDEA Gradle Dependencies Formatter 使用指南

IDEA Gradle Dependencies Formatter 使用指南 项目目录结构及介绍 ├── build.gradle # 主构建脚本,定义了项目构建规则 ├── gradlew # Gradle Wrapper脚本,用于跨平台运行Gradle命令 ├── gradlew.bat # Windows平台下的Gradle Wrapp...

gitblog_00006的博客 467
上一篇: Gradle笔记 七 publishing 项目发布
下一篇: rust 闭包
过去日记
过去日记 新星创作者: 后端开发技术领域 新星创作者: 后端开发技术领域
博客等级 码龄3年 5343粉丝 225原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

过去日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值