Gradle的学习

1.1 Gradle的优势

  • 一款最新的,功能最强大的构建工具,用它逼格更高

  • 使用Groovy或Kotlin代替XML,使用程序代替传统的XML配置,项目构建更灵活

  • 丰富的第三方插件,让你随心所欲使用

  • 完善Android,Java开发技术体系

1.2 Gradle的下载和安装

下载位置:Gradle Distributions

PS:下载只有二进制文件的即可(bin那个压缩包)

1.3 配置环境变量

配置GRADLE_HOME:

image.png

配置Path:

image.png

验证Gradle是否安装成功:

image.png

1.4 创建第一个Gradle项目

image.png

image.png

标准项目结构:

image.png

image.png

image.png

image.png

项目打包:

image.png

执行:

image.png

如果出现乱码,在builde.gradle中加入配置:(更改后重新clean再build)

plugins {id 'java'
}
​
group 'com.msb'
version '1.0-SNAPSHOT'
​
repositories {mavenCentral()
}
​
dependencies {testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0'testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
}
​
test {useJUnitPlatform()
}
​
tasks.withType(JavaCompile) {options.encoding = "UTF-8"
}

PS:

image.png

1.5 build.gradle构建脚本介绍

Gradle构建脚本中最重要的两个概念是project和Task,任何一个Gradle构建都由一个或者多个project组成每个project包括许多的构建部分,可以是一个jar包,也可以是一个web应用,也可以是多个jar的整合,可以部署应用和搭建环境.

image.png

如果有子项目的话:

image.png

每个项目,对应一个build.gradle的构建脚本

1.5.1 Project

一个project代表一个正在构建的组件(Jar/war文件),当构建开始时,Gradle会基于build.gradle实例化一个org.gradle.api.Project对象,并通过project变量来隐式调用其成员。

Project属性:

image.png

将build.gradle配置封装为一个Project对象,对象名字为project,通过project可以隐式调用:使用groovy语法

image.png

指定仓库位置:默认情况下使用的是中央仓库,此项目如果需要下载jar包从中央仓库中下载到本地目录(C:/Users/zss/.gradle)
mavenCentral()
下载后的内容可以去:C:\Users\zss\.gradle\caches\modules-2\files-2.1中找
但是一般我们习惯使用maven本地仓库:
需要设置maven本地仓库:

进行环境变量设置:

image.png

重启IDEA打开,如果需要重新设置maven本地库位置:

image.png

PS:本地仓库的设置对新建项目是生效的

如果需要添加依赖,可以从中央仓库中查找坐标:

image.png

粘贴过来以后,点击刷新:

image.png

build.gradle中内容:

plugins {id 'java'
}
​
project.group = 'com.msb'
version '1.0-SNAPSHOT'
/*
指定仓库位置:默认情况下使用的是中央仓库,此项目如果需要下载jar包从中央仓库中下载到本地目录(C:/Users/zss/.gradle)
mavenCentral()
下载后的内容可以去:C:\Users\zss\.gradle\caches\modules-2\files-2.1中找
但是一般我们习惯使用maven本地仓库:
需要设置maven本地仓库:
*/
repositories {mavenLocal()mavenCentral()
}
​
dependencies {testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0'testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'// https://mvnrepository.com/artifact/org.mybatis/mybatisimplementation group: 'org.mybatis', name: 'mybatis', version: '3.5.9'
​
}
​
test {useJUnitPlatform()
}
​
tasks.withType(JavaCompile) {options.encoding = "UTF-8"
}

PS:Gradle没有自己的中央仓库,用的就是maven的中央仓库

1.5.2 Task

每个任务在构建执行过程中会被封装成org.gradle.api.Task对象,主要包括任务的动作和任务依赖,任务动作定义了一个原子操作,可以定义依赖其他任务、动作的顺序、执行的条件。

任务主要操作动作: dependsOn:依赖相关操作 doFirst :任务执行之前执行的方法 doLast、<<(老版本用,现在废弃了):任务执行之后执行的方法

定义好任务后,默认分配在other分组下:

image.png

也可以放在自定义的分组下:

image.png

任务的定义的方式:(6种定义方式)

plugins {id 'java'
}
​
project.group = 'com.msb'
version '1.0-SNAPSHOT'
/*
指定仓库位置:默认情况下使用的是中央仓库,此项目如果需要下载jar包从中央仓库中下载到本地目录(C:/Users/zss/.gradle)
mavenCentral()
下载后的内容可以去:C:\Users\zss\.gradle\caches\modules-2\files-2.1中找
但是一般我们习惯使用maven本地仓库:
需要设置maven本地仓库:
*/
repositories {mavenLocal()mavenCentral()
}
​
dependencies {testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0'testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'// https://mvnrepository.com/artifact/org.mybatis/mybatisimplementation group: 'org.mybatis', name: 'mybatis', version: '3.5.9'
​
}
​
test {useJUnitPlatform()
}
​
tasks.withType(JavaCompile) {options.encoding = "UTF-8"
}
​
//自定义任务:
//定义方式1:
task(t1,{group("mytask")//配置代码println '我是任务1'//动作代码doFirst {println '在任务t1执行前操作的动作代码'}//动作代码doLast {println '在任务t1执行后操作的动作代码'}
})
//定义方式2:
task t2 {group("mytask")//配置代码println '我是任务2'//动作代码doFirst {println '在任务t2执行前操作的动作代码'}//动作代码doLast {println '在任务t2执行后操作的动作代码'}
}
​
//定义方式3:
tasks.create('t3'){group("mytask")//配置代码println '我是任务3'
}
​
//定义方式4:
tasks.register('t4'){group("mytask")//配置代码println '我是任务4'
}
​
//定义方式5:
tasks{task t5{group("mytask")//配置代码println '我是任务5'}
}
​
//可以一次性定义多个任务-》动态任务定义:
3.times{index ->task("task${index}"){group("mytask")//配置代码println 'task${index}'}
}

任务依赖:

//任务依赖:
task a{doFirst {println '我是任务a'}
}
​
task b(dependsOn:a){//代表b任务依赖a任务--->依赖方式通过参数传递doFirst {println '我是任务b'}
}
​
task c{dependsOn 'b'  //依赖方式通过内部设置方式进行依赖doFirst {println '我是任务c'}
}
​
task d{doFirst {println '我是任务d'}
}
​
d.dependsOn c   //依赖方式通过外部设置方式进行依赖

任务的执行时机:

在构建阶段,配置代码是不执行的,在执行阶段,执行动作代码

//通过tasks.register定义的任务,在build阶段的配置过程中不执行
//通过tasks.register定义的任务,在任务的执行阶段的配置过程中是执行的
//通过tasks.register定义的任务,配置代码的执行时机是落后于用task方式配置的

定位任务:对某个已有的任务进行扩展:例如对clean内置任务进行扩展

clean.doLast {println '我在clean之后执行这个逻辑'
}
​
tasks.named('clean').get().doFirst {println '我在clean之前执行这个逻辑'
}

1.6 Gradle项目构建生命周期

Gradle的生命周期分三个阶段:初始化阶段、配置阶段,、执行阶段。 初始化阶段 通过settings.gradlle判断有哪些项目需要初始化,加载所有需要初始化的项目的build.gradle文件并为每个项目创建project对象 配置阶段 执行各项目下的build.gradle脚本,完成project 的配置,并且构造Task任务依赖关系图以便在执行阶段按照依赖关系执行Task中的配置代码 执行阶段 通过配置阶段的Task图,按顺序执行需要执行的任务中的动作代码,就是执行任务中写在doFirst或doLast中的代码。

1.7 插件

1.7.1 添加插件、发布和使用自定义jar包

案例:将自己的项目打成jar包,供给另外的项目使用

(1)新建一个Gradle项目:

image.png

(2)配置插件:

image.png

(3)然后刷新项目,刷新后任务中多了一个分组:

image.png

(4)配置发布分组:在build.gradle中配置:

image.png

(5)执行任务,发布jar包到本地仓库中:

image.png

(6)自行去本地库中查找你jar包和生成的配置文件:

C:\Users\zss.m2\repository\org\example\TestGradleJar

image.png

(7)在其它项目中使用刚才本地库中的jar包:

image.png

(8)验证:是否可以使用jar包中内容:

image.png

1.7.2 自定义插件

(1)在构建脚本中直接编写自定义插件:

image.png

但是上面的方法只能在当前脚本中使用,不可以在整个项目中使用,如果要想在整个项目中的所有构建脚本中都使用的话,需要将任务单独提取出来放入buildSrc下:

(2)自己创建buildSrc目录:

image.png

注意点:groovy目录创建好后一定要是蓝色的文件夹,如果是灰色的文件夹,需要自己构建build.gradle脚本,然后加入插件:

image.png

然后定义插件:

image.png

定义好以后,就可以在项目的所有build.gradle中使用了:

image.png

1.8 Gradle版本冲突问题

(1)依赖传递性:

假设你的项目依赖于一个库,而这个库又依赖于其他库。你不必自己去找出所有这些依赖,你只需要加上你直接依赖的库,Gradle会隐式的把这些库间接依赖的库也加入到你的项目中。

image.png

(2)传递性依赖中版本冲突:

由于传递性依赖的特点,两个不同版本的jar包会被依赖进来,这样就存在版本冲突的问题。

image.png

(3)maven中解决冲突的办法-自动解决方案:

【1】第一原则:最短路径优先原则

“最短路径优先”意味着项目依赖关系树中路径最短的版本会被使用。

例如,假设A、B、C之间的依赖关系是A->B->C->D(2.0) 和A->E->(D1.0),那么D(1.0)会被使用,因为A通过E到D的路径更短。

【2】第二原则:最先声明原则

依赖路径长度是一样的的时候,第一原则不能解决所有问题,比如这样的依赖关系:A–>B–>Y(1.0),A–>C–>Y(2.0),Y(1.0)和Y(2.0)的依赖路径长度是一样的,都为2。那么到底谁会被解析使用呢?在maven2.0.8及之前的版本中,这是不确定的,但是maven2.0.9开始,为了尽可能避免构建的不确定性,maven定义了依赖调解的第二原则:第一声明者优先。在依赖路径长度相等的前提下,在POM中依赖声明的顺序决定了谁会被解析使用。顺序最靠前的那个依赖优胜。

(4)Gradle中解决冲突的办法-自动解决方案:

Gradle的默认自动解决版本冲突的方案是选用版本最高的。

案例:加入两个依赖:

implementation group: 'org.springframework', name: 'spring-jdbc', version: '5.1.3.RELEASE'
implementation group: 'org.springframework', name: 'spring-webmvc', version: '5.1.13.RELEASE'
​

image.png

(5)Gradle中解决冲突的办法-手动修改依赖:

手动排除依赖:

dependencies { implementation(group: 'org.springframework', name: 'spring-jdbc', version: '5.1.3.RELEASE'){exclude group:'org.springframework',module:'spring-beans'}
}

后续可以自己手动配置你想要的版本的依赖。

修改默认配置策略,对所有jar不做冲突自动解决:

configurations.all{resolutionStrategy{failOnVersionConflict()}
}

就会在构建时候抛出异常:

image.png

手动指定某个jar 的版本:

force:强制覆盖某个版本:

configurations.all{resolutionStrategy{force 'org.springframework:spring-beans:5.3.12'}
}

image.png

1.9 多项目构建

在企业中,一个复杂的项目往往是分成几个小项目来协同完成的,这就涉及到多项目的构建,而多项目构建则需要把一个大项目进行项目模块化,通过模块的互相协作完成整个功能。在之前使用Maven的多项目构建时,一般需要一个root项目来统一管理所有的模块,Gradle也一样使用一个root项目来统一管理所有的模块。

案例:

image.png

构建:

image.png

配置:

配置1:统一插件配置:在根项目的build.gradle中配置:

//统一配置信息,包含root项目:
allprojects{//写法1:
//    plugins {
//        id 'java'
//    } //写法2:apply plugin : 'java'
}

配置2:统一配置公共属性:

​
allprojects{project.group = 'com.msb'version '1.0-SNAPSHOT'
}
​

配置3:配置项目的依赖关系:在子项目的build.gradle中配置:

image.png

image.png

验证:

image.png

配置4:统一资源库:

subprojects{repositories {mavenLocal()mavenCentral()}
}

配置5:配置公用的依赖:配置在根项目的build.gradle中:

subprojects{
​dependencies {testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0'testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'}
​
}
​

PS:如果配置在subprojects外面,就只针对根生效,对子项目无效,只有放在subprojects中对所有项目生效

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

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

相关文章

[Algorithm][动态规划][子数组/子串问题][最大子数组和][环形子数组的最大和][乘积最大子数组][乘积为正数的最长子数组长度]详细讲解

目录 1.最大子数组和1.题目链接2.算法原理详解3.代码实现 2.环形子数组的最大和1.题目链接2.算法原理详解3.代码实现 3.乘积最大子数组1.题目链接2.算法原理详解3.代码实现 4.乘积为正数的最长子数组长度1.题目链接2.算法原理详解3.代码实现 1.最大子数组和 1.题目链接 最大子…

CSS(七)

文章目录 CSS&#xff08;七&#xff09;1. 精灵图&#xff08;重点&#xff09;1.1 为什么需要精灵图1.2 精灵图&#xff08;sprites&#xff09;的使用1.3 案例&#xff1a;拼出自己名字1.3.1 案例效果1.3.2 代码参考 2. 字体图标2.1 字体图标的产生2.2 字体图标的优点**2.3*…

玩转STM32-通用同步/异步收发器USART(详细-慢工出细活)

CPU与外围设备之间的信息交换或计算机与计算机之间的信息交换称为通信。基 本的通信方式有两种&#xff0c;即并行通信和串行通信。文章目录 一、串行通信基础1.1 串行通信的方式1.2 串行通信的数据传输形式1.3 波特率 二、STM32的USART的结构特征&#xff08;了解&#xff09;…

每天五分钟深度学习:如何使用计算图来反向计算参数的导数?

本文重点 在上一个课程中&#xff0c;我们使用一个例子来计算函数J&#xff0c;也就相当于前向传播的过程&#xff0c;本节课程我们将学习如何使用计算图计算函数J的导数。相当于反向传播的过程。 计算J对v的导数&#xff0c;dJ/dv3 计算J对a的导数&#xff0c;dJ/da&#xf…

【Mybatis】映射文件中获取参数的符号#{}和${}的区别

在xml映射文件中获取参数的符号都是用的#{}的方式&#xff0c;其实Mybatis还支持另一种符号来接收传递过来的参数值&#xff0c;就是${}&#xff0c;他们是区别就在与底层使用jdbc的statement不一样 #{}对应的是PreparedStatementd对象来执行sql语句 ${}对应的是Statement对象…

AGV行业怎么办?投标价格没有最低,只有更低~

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 随着移动机器人&#xff08;AGV/AMR&#xff09;行业的快速发展&#xff0c;市场逐渐从初期的高速增长转向成熟阶段。 2024年&#xff0c;AGV企业…

数据库自动化管理的六大等级

什么是数据库自动化管理&#xff1f; 数据库自动化管理是指通过使用工具和流程&#xff0c;在尽量减少人为干预的情况下&#xff0c;管理和执行与数据库相关的任务。主要目的当然是提高效率&#xff0c;减少人为错误&#xff0c;确保一致性&#xff0c;并解放 DBA 和开发者&am…

【Mybatis】映射文件中#{}里的其他属性

#{}里除了可以写接收参数的名称外&#xff0c;还可以设置javaType&#xff0c;jdbcType&#xff0c;mode&#xff0c;numericScale,resultMap,typeHandler,jdbcTypeName这些属性的。 其他的属性除mode&#xff08;存储过程相关讲到存储过程的时候在讲&#xff09;外使用方式都…

5-时间、日期与组合框

时间、日期与组合框 1 日期时间1.1 日期时间相关的类1.2 日期、时间和字符串的转换1.3 例子 2、组合框2.1 QComboBox2.2 QPlainTextEdit2.3 案例 3、自定义右键菜单 1 日期时间 1.1 日期时间相关的类 QTime 时间数据类型&#xff0c;仅表示时间&#xff0c;如&#xff1a;15:…

【数据结构与算法 经典例题】返回单链表的倒数第 k 个节点

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;数据结构与算法刷题系列&#xff08;C语言&#xff09; 期待您的关注 目录 一、问题描述 二、解题思路 方法一:计数器方式 方法…

Aleth-NeRF: Illumination Adaptive NeRF with Concealing Field Assumption

Abstract Aleth-NeRF: 带有隐蔽场假设的照明自适应 NeRF 照明照明标准的神经辐射场(NeRF)范例采用了一种以观察者为中心的方法,将光照和材料反射的各个方面仅仅从3D 点发射纠缠在一起。这种简化的渲染方法在准确建模在不利光照条件下捕获的图像方面提出了挑战,如弱光或过度曝…

npm install node-sass 安装失败的解决方案:利用国内镜像加速安装

在开发前端项目时&#xff0c;使用Sass作为CSS预处理器是很多开发者的选择。然而&#xff0c;在通过npm安装其Node.js绑定库node-sass时&#xff0c;一些开发者可能会遇到安装失败的问题&#xff0c;尤其是网络原因导致的下载缓慢或中断。本文将指导你如何通过更换为国内镜像源…

The 2022 ICPC Asia Nanjing Regional Contest - External G

题目链接:Problem - D - Codeforces 写在前面&#xff1a;今天的训练赛打的稀碎&#xff0c;一道稍微难一点的签到题就把我难住了&#xff0c;看完题解确实感觉不难&#xff0c;看来题目还是刷太少了。 回归正题 题意&#xff1a; 思路&#xff1a;尽量让分子大&#xff0c;分…

【NumPy】深入了解NumPy的multiply函数:高效矩阵和数组乘法指南

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

HNU-人工智能-作业3

人工智能-作业3 计科210X 甘晴void 202108010XXX 1.贝叶斯网络 根据图所给出的贝叶斯网络&#xff0c;其中&#xff1a;P(A)0.5&#xff0c;P(B|A)1&#xff0c; P(B|A)0.5&#xff0c; P(C|A)1&#xff0c; P(C|A)0.5&#xff0c;P(D|BC)1&#xff0c;P(D|B, C)0.5&#xff…

循环buffer“一写多读“

1.往期回顾 一个简单实用的循环buffer&#xff0c;用于缓冲数据&#xff01;测试500M数据&#xff0c;耗时1.3秒。 C语言版本的循环buffer比C版本的速度更快&#xff01;测试500M数据0.5秒&#xff0c;达9.25Gbps左右&#xff01; C 语言免拷贝版本循环 buffer 比拷贝版本快了…

Golang并发编程-协程goroutine的信道(channel)

文章目录 前言一、信道的定义与使用信道的声明信道的使用二、信道的容量与长度三、缓冲信道与无缓冲信道缓冲信道无缓冲信道四、信道的初体验信道关闭的广播机制总结前言 Goroutine的开发,当遇到生产者消费者场景的时候,离不开 channel(信道)的使用。 信道,就是一个管道,…

Redis介绍及安装配置

1 什么是Redis Redis 的定义&#xff1a;Redis&#xff08;Remote Dictionary Server 远程字典服务&#xff09;是一个开源的使用C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。 可见Redis和我们最经常使用的MySQL都…

技术创新加速生态繁荣 | 软通动力子公司鸿湖万联亮相OpenHarmony开发者大会2024

5月25日&#xff0c;由开放原子开源基金会OpenHarmony项目群工作委员会主办的OpenHarmony开发者大会2024在深圳成功举行。本次大会紧扣OpenHarmony 4.1 Release版本发布契机&#xff0c;以“鸿心聚力&#xff0c;智引未来”为主题、通过“1场主论坛6场技术分论坛”承载&#xf…

mysql 8 [HY000][1114] The table ‘/tmp/#sql4c3_3e5a0_2‘ is full

分组有个比较大的表&#xff0c;出现了临时表空间满了的情况&#xff1b; 试用该sql 语句&#xff1a; SHOW GLOBAL VARIABLES LIKE internal_tmp_mem_storage_engine; 可以看到 默认临时结果是用临时表存的&#xff0c;在mysql的my.cnt可以改临时空间的大小 但是磁盘哪有内…