Gradle的学习

news2024/12/22 23:00:02

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/mybatis
    implementation 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/mybatis
    implementation 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.coloradmin.cn/o/1711516.html

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

相关文章

Filebeat进阶指南:核心架构与功能组件的深度剖析

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《洞察之眼&#xff1a;ELK监控与可视化》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、什么是ELK 2、FileBeat在ELK中的角色 二、Fil…

树莓派4B 学习笔记1:TF卡系统盘烧录_初次启动_远程端连接配置

今日开始学习树莓派4B 4G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; TF卡系统盘烧录_初次启动_远程端连接配置 目录 格式化SD卡&#xff1a; 烧录系统Win32DiskImager&#xff1a; Raspberry Pi Imager镜像烧写&#xff1a; 树莓派官网资料…

教育装备之先导小型五轴加工中心

随着制造业的快速发展和技术的不断进步&#xff0c;对高端技术人才的需求日益增长。五轴联动技术作为解决异性复杂零件高效优质加工问题的重要手段&#xff0c;受到了广泛关注。因此&#xff0c;培养掌握五轴联动技术的专业人才显得尤为重要。 先导小型五轴加工中心提供了真实的…

「数据结构」队列

目录 队列的基本概念 队列的实现 头文件queue.h 实现函数接口 1.初始化和销毁 2.出队列和入队列 3.获取队头元素和队尾元素 4.队列长度判空 后记 前言 欢迎大家来到小鸥的博客~ 个人主页&#xff1a;海盗猫鸥 本篇专题&#xff1a;数据结构 多谢大家的支持啦&#xff…

对比表征学习(一)Contrastive Representation Learning

对比表征学习&#xff08;二&#xff09;Sentence Embedding 主要参考翁莉莲的Blog&#xff0c;本文主要聚焦于对比损失函数 对比表示学习&#xff08;Contrastive Representation Learning&#xff09;可以用来优化嵌入空间&#xff0c;使相似的数据靠近&#xff0c;不相似的数…

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

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

采集EthernetIP IO从站设备数据 转 profinet IO协议项目案例

1 文档说明 设置网关采集EthernetIP IO设备数据把采集的数据转成profinet IO协议转发给其他系统。 2 准备工作 仰科网关。支持采集EthernetIP IO数据&#xff0c;profinet IO协议转发。电脑。IP设置成192.168.1.198&#xff0c;和网关在同一个网段。网线、12V电源。 3 网关…

MySQL8报错Public Key Retrieval is not allowedz 怎么解决?

问题描述 当我们使用数据库管理工具连接mysql8的时候&#xff0c;可能遇到报错&#xff1a; Public Key Retrieval is not allowed 解决办法 1、在连接属性中配置allowPublicKeyRetrieval设置为true 2、在连接URL中加上配置allowPublicKeyRetrieval为true

《软件方法(下)》8.3.4.6 DDD话语“聚合”中的伪创新(1)

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 8.3 建模步骤C-2 识别类的关系 8.3.4 识别关联关系 8.3.4.6 DDD话语“聚合”中的伪创新 DDD话语中也有“聚合”。Eric Evans的“Domain-Driven Design: Tackling Complexity in the…

「光储充放」一体充电站-一文读懂光储充放充电站

“光储充放”一体充电站作为一种储能充电的新形式渐渐走进人们的生活&#xff0c;全国很多地区都开始陆续投放运营“光储充放”一体充电站&#xff0c;今天的这篇文章&#xff0c;就带大家全面了解“光储充放”这一新型充电站。 头图来源 | 视觉中国 01 政策背景 早在2020年…

43-2 Linux入侵排查实验

环境准备: 老规则,我没有靶场就自己搭建了类似, 这里准备一台CentOS 7虚拟机作为受害者,然后使用CS制作木马并在受害者主机上线,具体过程可以看我之前写的一篇文章: 黑客必备利器:如何在系统上安装和使用 CobaltStrike(简称:CS)_cobalt strike-CSDN博客 最终的效果…

【ARFoundation自学03】AR Point Cloud 点云(参考点标记)功能详解

和平面识别框架一样 1为XR Origin添加AR Point Cloud Manager组件 然后你的ar应用就具备了点云识别功能&#xff0c;就这么简单 2.可视化这些云点 创建一个美术效果的预制体&#xff0c;人家提供了预设模板 然后拖到仓库&#xff08;ASSETS&#xff09;创建预制体&#xff…

红酒与不同烹饪方法的食物搭配原则

红酒与食物的搭配是一门艺术&#xff0c;而不同烹饪方法的食物与红酒的搭配也有其与众不同之处。红酒与食物的搭配不仅涉及到口感、风味和营养&#xff0c;还与烹饪方法和食物质地等因素息息相关。云仓酒庄雷盛红酒以其卓着的品质和丰富的口感&#xff0c;成为了实现完善搭配的…

常用压力、流量单位换算表

一、压力为单位面积所承受的力 压力&#xff1a;绝对压力 、表压力 、大气压力。相互关系&#xff1a;绝对压力表压力大气压力 绝对压力:当压力表示与完全真空的差。测量处的实际压力。 表压力:当表示其气体数值与该地域大气压力的差值。 大气压力&#xff1a;由大气重量所…

JAVA学习·String类的常用方法

String 类及其创建 String 类的创建 String 类是 Java 内置的一个类&#xff0c;其完全限定类名是java.lang.String。想要创建一个字符串有多重方式&#xff0c;比如创建字符串"Hello"&#xff1a; String s1 "Hello"; // 字面量创建 String s2 new St…

IDEA升级web项目为maven项目乱码

今天将一个java web项目改造为maven项目。 首先&#xff0c;创建一个新的maven项目&#xff0c;将文件拷贝到新项目中。 其次&#xff0c;将旧项目的jar包&#xff0c;在maven的pom.xml做成依赖 接着&#xff0c;把没有maven坐标的jar包在编译的时候也包含进来 <build>…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 5月29日,星期三

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年5月29日 星期三 农历四月廿二 1、 首个未成年人游戏退费标准发布&#xff1a;监护人与网游服务提供者将按错担责。 2、 六部门联合印发通知&#xff1a;鼓励加快高清超高清电视机等普及、更新。 3、 神舟十八号航天员乘…

Rocksdb原理简介

100编程书屋_孔夫子旧书网 Rocksdb作为当下nosql中性能的代表被各个存储组件&#xff08;mysql、tikv、pmdk、bluestore&#xff09;作为存储引擎底座&#xff0c;其基于LSM tree的核心存储结构&#xff08;将随机写通过数据结构转化为顺序写&#xff09;来提供高性能的写吞吐时…

上海亚商投顾:沪指冲高回落 电力、电网产业链持续爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日震荡调整&#xff0c;深成指、创业板指均跌超1%。电力、电网股再度爆发&#xff0c;众智科技、郴电国…

Post Microsoft Build and AI Day 上海开发者日

点击蓝字 关注我们 编辑&#xff1a;Alan Wang 排版&#xff1a;Rani Sun 这个六一怎么过&#xff1f;来微软 Reactor&#xff0c;一起过儿童节吧&#xff01; 6月1日&#xff0c;Microsoft Azure & Microsoft Reactor 面向大小朋友特别推出六一特辑&#xff0c;「Post Mic…