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/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中对所有项目生效

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入解析数据库中的连接方法:四种关键技巧

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、连接方法的重要性 二、左连接&#xff08;Left Join&#xff09; 三、右连接&#xff…

C# yolov8 TensorRT Demo

C# yolov8 TensorRT Demo 目录 效果 说明 项目 代码 下载 效果 说明 环境 NVIDIA GeForce RTX 4060 Laptop GPU cuda12.1cudnn 8.8.1TensorRT-8.6.1.6 版本和我不一致的需要重新编译TensorRtExtern.dll&#xff0c;TensorRtExtern源码地址&#xff1a;https://githu…

【全开源】简单商城系统源码(PC/UniAPP)

提供PC版本、UniAPP版本(高级授权)、支持多规格商品、优惠券、积分兑换、快递鸟电子面单、支持移动端样式、统计报表等 提供全部前后台无加密源代码、数据库离线部署。 构建您的在线商店的基石 一、引言&#xff1a;为什么选择简单商城系统源码&#xff1f; 在数字化时代&am…

立创·天空星开发板-GD32F407VE-环境搭建

本文以 立创天空星开发板-GD32F407VET6-青春版 作为学习的板子&#xff0c;记录学习笔记。 立创天空星开发板-GD32F407VET6-环境搭建 单片机ARMARM内核系列Cortex-M系列常用ARM芯片厂商 GD32GD32的产品系列开发板开发板资源、尺寸标注图设计图纸 GD32F407 Keil ARM 安装下载地址…

浏览器下载的文件为什么不允许我指定下载位置

文章目录 问题分析 问题 我们在做B端开发时&#xff0c;通常会遇到用户问道&#xff1a;我下载的文件为什么不能下载到指定位置让我手动去选择呢 分析 我们开发是基于浏览器做的开发&#xff0c;因此要遵循浏览器的限制条件 浏览器限制用户自定义下载地址的主要原因是出于…

Autoware 技术代码解读(三)

Tip: 如果你在进行深度学习、自动驾驶、模型推理、微调或AI绘画出图等任务&#xff0c;并且需要GPU资源&#xff0c;可以考虑使用Compshare的GPU算力云平台。他们提供高性价比的4090 GPU&#xff0c;按时收费每卡2.6元&#xff0c;月卡只需要1.7元每小时&#xff0c;并附带200G…

Nacos 2.x 系列【12】配置加密插件

文章目录 1. 前言2. 安装插件2.1 编译2.2 客户端2.3 服务端 3. 测试 1. 前言 为保证用户敏感配置数据的安全&#xff0c;Nacos提供了配置加密的新特性。降低了用户使用的风险&#xff0c;也不需要再对配置进行单独的加密处理。 前提条件&#xff1a; 版本:老版本暂时不兼容&…

【最新区块链论文录用资讯】CCF A—INFOCOM 2024 共17篇

Conference&#xff1a;IEEE International Conference on Computer Communications CCF level&#xff1a;CCF A Categories&#xff1a;计算机网络 Year&#xff1a;2024 Num&#xff1a;17 A Generic Blockchain-based Steganography Framework with High Capacity via …

openssh升级

原因&#xff1a;因为低版本出现了漏洞 过程&#xff1a; 此时&#xff0c;root不能登录。 修改/etc/pam.d/login 第2行前面加上#&#xff0c;保存退出 /etc/pam.d/remote 第2行前面加上#&#xff0c;保存退出 此时root可以通过telnet登录了 二、升级openssl和openssh 【L…

校园周边美食探索及分享平台,基于 SpringBoot+Vue+MySQL 开发的前后端分离的校园周边美食探索及分享平台设计实现

目录 一. 前言 二. 功能模块 2.1. 前台首页功能模块 2.2. 用户功能模块 2.3. 管理员功能模块 三. 部分代码实现 四. 源码下载 一. 前言 美食一直是与人们日常生活息息相关的产业。传统的电话订餐或者到店消费已经不能适应市场发展的需求。随着网络的迅速崛起&#xff0…

深入分析 Android Activity (十一)

文章目录 深入分析 Android Activity (十一)1. Activity 的内存管理和优化1.1 内存泄漏的常见原因1.2 避免内存泄漏的方法1.3 内存泄漏检测工具 2. Activity 的配置变更处理2.1 处理配置变更2.2 保存和恢复状态2.3 使用 ViewModel 3. Activity 的测试3.1 单元测试3.2 UI 测试 4…

数据结构(三)栈 队列 数组

2024年5月26日一稿&#xff08;王道P78&#xff09; 栈 基本概念 基本操作 顺序存储结构 基本操作 共享栈 链式存储结构 队列 基本概念 顺序存储结构 循环队列 链式存储结构 基本操作 双端队列 栈和队列的应用 括号匹配 表达式求值 递归 层次遍历 计算机系统 数组和特殊矩阵…

绘唐app官方版绘唐3AI工具

绘唐app官方版绘唐3AI工具 激活授权方式&#xff1a;https://qvfbz6lhqnd.feishu.cn/wiki/CcaewIWnSiAFgokOwLycwi0Encf 绘唐app是一款基于人工智能和摄影技术的应用程序&#xff0c;旨在帮助用户将照片转化为唐朝画风的艺术作品。 该应用程序使用先进的图像处理算法&#xf…

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

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

「西安邀请媒体参会」媒体宣发专访报道

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 一、媒体邀约目标 为提升活动的知名度和影响力&#xff0c;我们计划邀请西安地区的主流媒体、行业媒体以及网络媒体参与活动&#xff0c;并进行现场报道和专访。通过媒体的力量&#xff…

【云原生 | 59】Docker中通过docker-compose部署ELK

目录 1、组件介绍 2 、项目环境 2.1 各个环境版本 2.2 Docker-Compose变量配置 2.3 Docker-Compose服务配置 3、在Services中声明了四个服务 3.1 ElasticSearch服务 3.2 Logstash服务 3.3 Kibana服务 3.4 Filebeat服务 4、使用方法 4.1 方法一 4.2 方法二 5、启动…

解读makefile中的延迟变量与即时变量

在 Makefile 中&#xff0c;有两种类型的变量&#xff1a;即时变量&#xff08;immediate variable&#xff09;和延迟变量&#xff08;deferred variable&#xff09;。 它们在 Makefile 的执行过程中具有不同的特性和行为。 即时变量&#xff08;Immediate Variable&#x…

(C11) 泛型表达式

文章目录 ⭐语法⭐举例&#x1f6a9;判断对象类型&#x1f6a9;判断指针&#x1f6a9;函数重载&#x1f6a9;嵌套使用 END ⭐语法 Ref: 泛型选择 (C11 起) - cppreference.com 关键词&#xff1a; Genericdefault _Generic(控制表达式 , 关联列表) (C11 起) 关联列表 类型名:…

深度学习中文笔记.pdf

深度学习和机器学习应该如何入门呢&#xff1f;这是很多初学者经常提的问题&#xff0c;针对这个问题&#xff0c;相信很多过来人都会推荐吴恩达的在线课程。不过&#xff0c;由于是英文版本&#xff0c;就将很多人挡在了门外。 于是&#xff0c;在国内&#xff0c;以黄海广博士…

探索电商ERP平台的功能架构:实现高效运营的关键

在当今数字化时代&#xff0c;电子商务已经成为了商业运营的主流模式之一。为了应对日益激烈的市场竞争&#xff0c;企业需要借助先进的技术工具来提高运营效率和管理能力。在这篇博客中&#xff0c;我们将深入探讨电商ERP平台的功能架构&#xff0c;揭示其如何成为实现高效运营…