初探Gradle
目录
- 一.概述
- 二.优点
- 三.安装与配置
- 1. 官网下载
- 2. 配置环境变量
- 3. 检验
- 4. 配置国内镜像(可选)
- 5. IDEA配置
- 三.工程结构
- 四.生命周期
- 1.Initialization阶段
- 2.Configuration阶段
- 3.Execution阶段
- 五.Task
- 六.常用任务指令
- 七.引入依赖
- 1.本地依赖
- 2.项目依赖
- 3.直接依赖
- 八.依赖类型
- 九.插件
- 十.依赖冲突
一.概述
Java中主要有三大项目构建工具:Gradle、Maven和Ant,Gradle是继Maven之后的新一代构建工具,他采用基于Groovy的特定领域语言(DSL)作为脚本,相比通过XML来配置的传统构建工具(maven),最直观的感受就是脚本更加的简洁优雅
二.优点
- 多语言支持:Java、Groovy、Scala、C++都有良好的支持
- 跨平台支持:Gradle是基于JVM的,只要有JVM就可以让Gradle运行
- 脚本灵活性:Gradle使用的是Groovy或Kotlin语言作为脚本的编写语言,可以使用Groovy灵活的编写任务完成想要的任何事情
- 速度更快:Gradle有增量构建、构建缓存等概念,构建效率比Maven快些
三.安装与配置
1. 官网下载
进入官网https://gradle.org/releases/,点击binary-only进行下载,然后将下载好的压缩包解压到任意位置

2. 配置环境变量
新建一个名为GRADLE_HOME的变量,变量值->浏览目录选择Gradle根目录

配置Path->指定Gradle的bin目录

3. 检验
CMD窗口输入以下命令,如果出现版本号等信息,说明安装配置成功
gradle -v

4. 配置国内镜像(可选)
同Maven一样,Gradle也可以配置国内镜像来提升下载速度,我们打开用户目录的.gradle文件夹,创建一个init.gradle文件
allprojects {repositories {maven{ url 'http://maven.aliyun.com/repository/public/'}mavenCentral()}
}

5. IDEA配置

三.工程结构

四.生命周期
Gradle的生命周期分为三个阶段,Initialization->Configuration->Execution
1.Initialization阶段
执行init.gradle和setting.gradle,init gradle文件会在每个项目build之前被调用,完成一些初始化的操作,例如:
配置内部的仓库信息(如公司的maven仓库信息)
配置全局属性
配置用户名及密码信息
Setting.gradle决定哪些项目参与到构建中,为每个项目创建一个Project


2.Configuration阶段
执行build.gradle文件,顺序是先执行完所有父工程的,再执行子工程的,根据脚本代码创建对应的Task,最终根据所有Task生成有向无环图

3.Execution阶段
根据Configuration阶段的有向无环图,按顺序执行Task
五.Task
Gradle执行的最小单元是Task,Task包含三部分的行为,分别是doFirst、doSelf、doLast
Action的执行顺序:

下面是简单的Task演示
task("task1"){print("Configuration阶段执行")doFirst {print("Execution阶段执行,且在doLast前执行")}doLast {print("Execution阶段执行")}
}
编写Task1

执行Task1

六.常用任务指令

- gradle init: 初始化gradle项目
- gradle build: 构建项目,包括编译、测试、打包等操作,同步生成build文件夹
- gradle clean: 清除当前项目的build文件夹
- gradle bootjar: 生成jar包
- gradle projects: 展示项目层级
- gradle dependencies: 树形展示项目依赖
七.引入依赖
Gradle有三种引入依赖的方式,分别是本地依赖、项目依赖和直接依赖,都是在build.gradle文件中引入
1.本地依赖
- 文件集合方式指定
implementation files("lib/fastjson-1.2.83.jar", "lib/commons-io-2.11.0.jar")
- 文件树方式指定
implementation fileTree('dir':'lib', includes: ['fastjson*.jar'], excludes: ['commons-io-2.11.0.jar'])

2.项目依赖
implementation project(':subProject1')
subProject1必须在settings.gradle中声明

subProject1模块通过api引入的依赖就可以传导到rootProject工程(implementation引入的不支持),rootProject就可以直接使用gson依赖了

3.直接依赖
声明格式为 依赖的类型 依赖的组名,依赖的名称,依赖的版本号
implementation group:'com.google.code.gson',name:'gson',version:'2.8.5'
上述可以简写为
implementation 'com.google.code.gson:gson:2.8.5'

八.依赖类型
| 依赖类型 | 说明 |
|---|---|
| compileOnly | java插件提供,适用于仅编译器需要而无需打包的情况,取代老版本的compile |
| runtimeOnly | java插件提供,仅运行期有效,编译时不需要,比如mysql驱动包,取代老版本的runtime |
| implementation | java插件提供,针对src/main目录,在编译、运行时都有效 |
| testCompileOnly | java插件提供,仅测试编译时有效,运行时不需要 |
| testRuntimeOnly | jjava插件提供,只在测试运行时需要,编译时不需要 |
| testImplementation | java插件提供,针对src/test目录,在编译、运行时都有效 |
| providedCompile | war插件提供支持,编译、测试阶段代码需要,而运行阶段容器已经提供了相应的支持,所以无需打到war包中了,例如servlet-api.jar、jsp-api.jar |
| api | java-library插件提供支持,可以传递性地导出给使用者,用于编译和运行时 |
| compileOnlyApi | java-library插件提供支持,在声明的模块和使用者在编译时需要的依赖项,运行时不需要 |
api与implemention的区别
- api能进行依赖传导,下层变动,上层全部跟着变动,所以编译速度慢,适用于多模块依赖的情况,避免重复依赖
- implemention不能进行依赖传导,下层变动,上层不用全部变动,所以编译速度块,多数情况选择它
九.插件
在build.gradle文件中引入插件,不同的插件支持不同的依赖类型,java插件支持的,java-library插件都支持

十.依赖冲突
依赖冲突指的是如果存在某一依赖的多个版本, 最终只有一个版本的依赖能打包进jar /war包,对于Gradle来说就有冲突了
spring-boot-starter-test:2.7.9包含junit-jupiter:5.8.2版本的jar,同时我引入了junit-jupiter:5.9.0版本的jar
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.junit.jupiter:junit-jupiter:5.9.0'
下图中可以发现,Gradle默认会使用最新版本的 jar包(考虑到新版本的jar包一般都是向下兼容的),实际开发中也是建议使用官方自带的这种解决方案

同时Gradle还提供了一系列解决冲突的方法,例如exclude移除依赖、不允许依赖传递、强制使用某个版本
- exclude移除依赖
testImplementation('org.springframework.boot:spring-boot-starter-test'){exclude group:'org.junit.jupiter'// exclude module:'junit-jupiter'// exclude group:'org.junit.jupiter', module:'junit-jupiter'}

- 不允许依赖传递(不推荐使用)
testImplementation('org.springframework.boot:spring-boot-starter-test'){transitive(false)}
此时spring-boot-starter-test所引用的包将需要我们一个个手动去引入

- 强制使用某个版本(添加双感叹号)
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.junit.jupiter:junit-jupiter:5.9.0!!'
相关文章:
初探Gradle
目录一.概述二.优点三.安装与配置1. 官网下载2. 配置环境变量3. 检验4. 配置国内镜像(可选)5. IDEA配置三.工程结构四.生命周期1.Initialization阶段2.Configuration阶段3.Execution阶段五.Task六.常用任务指令七.引入依赖1.本地依赖2.项目依赖3.直接依赖八.依赖类型九.插件十.…...
国产数据库介绍
人大金仓 Kingbase 北京人大金仓信息技术股份有限公司于1999年由中共人民大学专家创立,自成立以来,始终立足自主研发,专注数据管理领域,先后承担了国家“863”、“核高基”等重大专项,研发出了具有国际先进水平的大型…...
Java OpenJudge-test3
目录 1:明明的随机数 2:合影效果 3:不重复的单词 4:和为给定数 5:字符串数组排序问题 6:字符串排序 7:求序列中的众数 1:明明的随机数 总时间限制: 1000ms 内存限制: 65536kB 描述 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性ÿ…...
蓝桥杯刷题冲刺 | 倒计时22天
作者:指针不指南吗 专栏:蓝桥杯倒计时冲刺 🐾马上就要蓝桥杯了,最后的这几天尤为重要,不可懈怠哦🐾 文章目录1.选数异或2.特殊年份1.选数异或 题目 链接: 选数异或 - 蓝桥云课 (lanqiao.cn) 给定…...
入行 5年,跳槽 3次,我终于摸透了软件测试这行(来自过来人的忠告)
目录 前言 第一年 第二年 第三年 第四年 作为过来人的一些忠告 前言 最近几年行业在如火如荼的发展壮大,以及其他传统公司都需要大批量的软件测试人员,但是20年的疫情导致大规模裁员,让人觉得行业寒冬已来,软件测试人员的职…...
开源时序数据库学习
计划学习使用QuestDB解决大数据日志存储场景。以下是常见引擎比较 比较项目 InfluxDB TimescaleDB OpenTSDB QuestDB 数据模型 Key-Value Relational Key-Value Relational 存储引擎 自主开发的TSI PostgreSQL扩展程序 Apache HBase 自主开发 查询语言 InfluxQ…...
字节测试工程师悄悄告诉我的软件测试、测试开发常用的测试策略与测试手段
目录 前言 测试策略的关注重点 测试策略主要内容 总体测试策略 初级版本测试策略 跟踪测试执行 版本质量评估 后续版本测试策略 发布质量评估 测试手段 前言 测试策略是指在特定环境约束之下,描述软件开发周期中关于测试原则、方法、方式的纲要ÿ…...
我常用的shell 进制转换工具
一、进制的一些基础知识 1. 二进制(binary) 二进制的取值是0和1; 前缀是 0b 2. 八进制(Octal) 八进制的取值是0-7;前缀是 O 3. 十进制(decimal) 十进制的取值是0-9;没有前缀 …...
手写vue(二)响应式实现
名词解释:vm:指Vue实例一、目标效果vue定义(1)新建vm时,可以通过一个data对象,或者data函数,其属性可以通过vm直接访问,而data对象可以通过vm._data获取(2)修…...
mysql数据库常问面试题
1、NOW()和CURRENT_DATE()有什么区别? NOW()命令用于显示当前年份,月份,日期,小时,分钟和秒。 CURRENT_DATE()仅显示当前年份,月份和日期。 2、CHAR和VARCHAR的区别? (1)…...
AI风暴 :文心一言 VS GPT-4
💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! 文心一言 VS GPT-4 文心一言:知识增强大语言模型百度全新一代知识增强大语言模型,文心大模型家族的新成员,能够与人对话互动&#…...
VR全景城市,用720全景树立城市形象,打造3D可视化智慧城市
随着城市化进程的加速,城市之间的竞争也日益激烈。城市管理者们需要寻求新的方式来提升城市的品牌形象和吸引力。在这个过程中,VR全景营销为城市提供了一种全新的营销手段,可以帮助提升城市的价值和吸引力。一、城市宣传新方式VR全景营销是一…...
javaweb窗口服务人员分析评价系统ssh
A)后台管理员模块:通过该功能模块,管理员可以修改自己的密码,并对管理员进行添加和删除操作。 B)注册用户模块:通过该功能模块,管理员可以查看注册用户的基本信息,对存在问题的用户进…...
树莓派Pico W无线开发板UDP协议MicroPython网络编程实践
树莓派Pico W无线开发板(简称Pico W)是树莓派基金会于2022年6月底推出的搭载无线通信芯片的树莓派Pico开发板。本文在介绍树莓派Pico W无线开发板接口信号和TCP/IP和UDP通信协议基础上,给出Pico W无线开发板的UDP协议MicroPython网络编程实例…...
跨域解决方案
跨域解决方案 1.跨域基本介绍 文档:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CORS 跨域问题是什么? 一句话:跨域指的是浏览器不能执行其他网站的脚本,它是由浏览器的同源策略造成的,是浏览器对 javascr…...
springboot的统一处理
在处理网络请求时,有一部分功能是需要抽出来统一处理的,与业务隔开。 登录校验 可以利用spring mvc的拦截器Interceptor,实现HandlerInterceptor接口即可。实现该接口后,会在把请求发给Controller之前进行拦截处理。 拦截器的实…...
C/C++每日一练(20230319)
目录 1. 反转链表 II 🌟🌟 2. 解码方法 🌟🌟 3. 擅长编码的小k 🌟🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 …...
GitHub 上有些什么好玩的项目?
前言 各个领域模块的都整理了一下,包含游戏、一些沙雕的工具、实用正经的工具以及一些相关的电商项目,希望他们可以给你学习的路上增加几分的乐趣,我们直接进入正题~ 游戏 1.吃豆人 一款经典的游戏开发案例,包括地图绘制、玩家控…...
蓝桥杯刷题第十二天
问题描述给定一个正整数 n ,请问 n 的十进制表示中末尾总共有几个 0 ?输入格式输入一行包含一个正整数 n。输出格式输出一个整数,表示答案。评测用例规模与约定对于所有评测用例,1 < n < 1000000000。运行限制最大运行时间&…...
开发也可以很快乐,让VSCode和CodeGPT带给你幸福感
CodeGPT 是一款 Visual Studio Code 扩展,可以通过官方的 OpenAI API 使用 GPT-3 (预训练生成式转换器) 模型,在多种编程语言中生成、解释、重构和文档化代码片段。CodeGPT 可用于各种任务,例如代码自动完成、生成和格式化。它还可以集成到代…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
消息队列系统设计与实践全解析
文章目录 🚀 消息队列系统设计与实践全解析🔍 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡💡 权衡决策框架 1.3 运维复杂度评估🔧 运维成本降低策略 🏗️ 二、典型架构设计2.1 分布式事务最终一致…...
一些实用的chrome扩展0x01
简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序,无论是测试应用程序、搜寻漏洞还是收集情报,它们都能提升工作流程。 FoxyProxy 代理管理工具,此扩展简化了使用代理(如 Burp…...
文件上传漏洞防御全攻略
要全面防范文件上传漏洞,需构建多层防御体系,结合技术验证、存储隔离与权限控制: 🔒 一、基础防护层 前端校验(仅辅助) 通过JavaScript限制文件后缀名(白名单)和大小,提…...
Xcode 16 集成 cocoapods 报错
基于 Xcode 16 新建工程项目,集成 cocoapods 执行 pod init 报错 ### Error RuntimeError - PBXGroup attempted to initialize an object with unknown ISA PBXFileSystemSynchronizedRootGroup from attributes: {"isa">"PBXFileSystemSynchro…...
