Gradle 使用详解

目录

一. 前言

二. 下载与安装

2.1. 下载

2.2. 配置环境变量

2.3. 配置镜像

2.3.1. 全局设置

2.3.2. 项目级设置

三. Gradle 配置文件

3.1. build.gradle

3.2. settings.gradle

3.3. gradle.properties

3.4. init.d 目录

3.5. buildSrc 目录

四. Java Library 插件配置

五. 构建 SpringBoot 多模块项目

5.1. 项目结构

5.2. GradleMultiModule 模块

5.3. GradleParent 模块(公共)

5.4. GradleCommon 模块(公共)

5.5. GradleUtil 模块(公共)

5.6. GradleServer 模块(业务)

5.7. GradleOne 模块(业务)

5.8. GradleTwo 模块(业务)

5.9. GradleStart 启动模块(业务)


一. 前言

    Gradle 是一个基于 Apache Ant 和 Apache Maven 概念的项目自动化构建开源工具。它使用一种基于 Groovy 的特定领域语言(DSL)来声明项目设置,也增加了基于 Kotlin 语言的 kotlin-based DSL,抛弃了基于 XML 的各种繁琐配置,面向 Java 应用为主。当前其支持的语言 C++、Java、Groovy、Kotlin、Scala 和 Swift,计划未来将支持更多的语言。

    Gradle 是一个基于 JVM 的项目构建工具,是一款通用灵活的构建工具,支持 maven、Ivy…多种第三方仓库,支持传递性依赖管理,而不需要远程仓库或者是 pom.xml 和 ivy.xml 配置文件,使用基于 Groovy 编写的集简洁性和可支持语言多样性等特点的 build 脚本文件。

二. 下载与安装

2.1. 下载

安装前置要求:已存在 Java 环境。JDK 配置请参见《JDK 环境变量设置》。

下载官网:https://services.gradle.org/distributions/

下载完成后解压:

2.2. 配置环境变量

在我们的系统环境变量中添加如下配置,步骤如下:

  1. GRADLE_HOME:gradle 的目录;
  2. GRADLE_USER_HOME:gradle 目录下的 repository 目录(解压后需新建);
  3. 在系统的 Path 中配置 %GRADLE_HOME%\bin。

测试 Gradle 是否安装成功,保证必须配置完毕!

2.3. 配置镜像

2.3.1. 全局设置

    在系统当前用户目录下新建一个 init.gradle 文件(也可以在 gradle 中的 init.d 文件夹中新建,在没有指定的情况下是读取当前用户目录下的配置):

在 init.gradle 文件中添加如下配置:

allprojects {
  repositories {
    mavenLocal()
    maven {
      url 'https://maven.aliyun.com/repository/public/'
    }
    maven {
      url 'https://maven.aliyun.com/repository/central'
    }
    mavenCentral()
  }
}

2.3.2. 项目级设置

直接在创建的 Gradle 项目中的 build.gradle 文件中配置:

三. Gradle 配置文件

    在 Gradle 中,可以有多个配置文件来定义构建过程和其他相关设置。其中,最主要的配置文件是 build.gradle,它通常位于项目的根目录下,用于定义项目的构建过程、依赖关系和其他构建相关的设置。

除此之外,还有其他的配置文件:

  • settings.gradle:用于配置 Gradle 的设置,例如定义项目的名称、子项目等信息。
  • gradle.properties:用于定义 Gradle 属性,例如设置构建缓存、定义构建版本等。
  • init.d 目录:用于在 Gradle 初始化时执行自定义的初始化脚本。
  • buildSrc 目录:用于存放与构建相关的代码,例如自定义任务、插件等。

这些配置文件在 Gradle 中扮演着不同的角色,用于定义构建过程、配置构建环境和执行构建任务等。

3.1. build.gradle

    build.gradle 是 Gradle 构建工具的主要配置文件之一,用于定义项目的构建过程、依赖关系和其他构建相关的设置。在该文件中,您可以定义任务、插件、依赖项和其他构建相关设置。

build.gradle 分为项目级和模块级:

  • 项目级:文件存在于根目录下,是整个项目的顶层 build.gradle。该 gradle 一般用来定义全局变量、依赖地址以及相关的清理操作。
  • 模块级:存在于单个子模块下(即模块专属 gradle)。

以下是 build.gradle 文件中最常见的设置:

1. 定义项目名称和版本:

group 'com.example'
version '1.0.0'

2. 添加构建依赖项:

dependencies {
    implementation 'com.google.guava:guava:29.0-jre'
    testImplementation 'junit:junit:4.13.2'
}

3. 定义自定义任务:

task myTask {
    group("MyTask") // 设置分组
    doLast {
        println "This is my custom task."
    }
}

4. 应用插件:

plugins {
    id 'java'
}

5. 定义源代码目录:

sourceSets {
    main {
        java {
            srcDirs = ['src/main/java']
        }
    }
}

6. 配置编译选项:

compileJava {
    options.encoding = 'UTF-8'
}

3.2. settings.gradle

    settings.gradle 是 Gradle 构建工具的配置文件之一,用于配置 Gradle 的全局设置以及多项目构建。在该文件中,您可以定义项目的名称、子项目、Gradle 插件、Gradle 版本等设置。

以下是 settings.gradle 文件中最常见的设置:

1. 定义项目名称:

rootProject.name = 'my-project'

2. 定义子项目:

include 'module1', 'module2'

3. 定义包含子项目的目录:

include 'module1:submodule1', 'module2:submodule2'

4. 排除子项目:

exclude 'module3'

5. 配置 Gradle 插件:

pluginManagement {
    repositories {
        gradlePluginPortal()
        maven {
            url 'https://plugins.gradle.org/m2/'
        }
    }
}

6. 配置 Gradle 版本:

gradle.version = '8.6'

注意:settings.gradle 文件只在多项目构建时才会使用。如果您只需要进行单项目构建,不需要使用 settings.gradle 文件。

3.3. gradle.properties

    gradle.properties 是 Gradle 构建工具的配置文件之一,用于定义构建脚本中使用的变量和属性。该文件通常用于定义一些公共的属性或配置,这些配置可以在构建过程中重复使用,例如依赖版本号、构建工具的版本号等。

以下是 gradle.properties 文件中最常见的设置:

1. 定义依赖版本号:

springVersion=5.3.10

2. 定义构建工具版本号:

gradleVersion=8.6

3. 定义其他属性:

myProperty=value

这些属性可以在 build.gradle 文件中使用。

例如,以下代码演示了如何在 build.gradle 文件中使用 gradle.properties 文件中定义的属性:

dependencies {
    implementation "org.springframework:spring-core:${springVersion}"
}

    此外,还可以在 gradle.properties 文件中定义 Gradle 构建工具的全局配置,例如代理设置、Gradle 守护进程设置等。

    gradle.properties 文件是 Gradle 构建过程中非常重要的一部分,它可以使构建脚本更加模块化和可维护。

注意:如果在 gradle.properties 和 build.gradle 文件中同时定义了同名属性,build.gradle 文件中定义的属性会覆盖 gradle.properties 文件中定义的属性。

3.4. init.d 目录

    init.d 目录是 Gradle 构建工具用于初始化构建的目录之一。在该目录下,您可以添加一些初始化脚本,这些脚本会在 Gradle 构建时被执行。

    通常,init.d 目录下的脚本可以用于执行一些通用的初始化任务,例如设置环境变量、添加仓库、定义插件等。这些脚本可以在多个项目中共享,可以使您的构建脚本更加模块化和可维护。

    默认情况下,Gradle 不会在 init.d 目录下查找任何脚本文件。如果您需要 Gradle 查找并执行 init.d 目录下的脚本,需要在 settings.gradle 文件中添加以下配置:

//启动初始化脚本
enableFeaturePreview('GRADLE_METADATA')
apply from: 'gradle/init.gradle'

    上面的配置启用了 Gradle 的实验特性 GRADLE_METADATA,并在 gradle/init.gradle 脚本中定义了初始化脚本的查找路径。然后,您可以在 gradle/init.d 目录下添加一些脚本文件,这些脚本文件会在 Gradle 构建时被执行。

例如,以下是一个简单的 gradle/init.d 目录下的脚本文件,用于添加一个 Maven 仓库:

allprojects {
    repositories {
        maven {
            url "https://maven.example.com/"
        }
    }
}

注意:init.d 目录下的脚本文件执行的顺序是根据文件名的字母顺序来确定的。如果您需要控制脚本文件的执行顺序,可以在文件名中添加一些数字前缀。例如,01-init.gradle 文件会在 02-init.gradle 文件之前被执行。

3.5. buildSrc 目录

    buildSrc 是 Gradle 构建工具的一个特殊目录,用于创建和管理构建脚本中的插件和依赖。

    buildSrc 目录下的代码会在项目构建之前被编译和执行,并且可以被项目中的其他构建脚本所使用。这意味着您可以在 buildSrc 目录下编写自定义插件或添加依赖,然后在项目的其他构建脚本中使用它们,从而实现更加灵活和可重用的构建过程。

    通常,buildSrc 目录下的代码使用 Gradle 的 Groovy 插件或 Kotlin 插件进行编写,这样可以让您使用相同的语言和 API 来编写项目中的构建脚本和 buildSrc 目录下的代码。

    例如,以下是一个简单的 buildSrc 目录下的 Groovy 代码文件,用于定义一个自定义的任务:

// buildSrc/src/main/groovy/com/example/MyTask.groovy
package com.example
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction
class MyTask extends DefaultTask {
    @TaskAction
    void myTaskAction() {
        println "Hello from my task!"
    }
}

然后可以在项目的 build.gradle 文件中使用该自定义任务:

// build.gradle
task myTask(type: com.example.MyTask)

    在这个例子中,buildSrc 目录下的代码定义了一个名为 MyTask 的自定义任务,然后在项目的  build.gradle 文件中使用该自定义任务来创建一个名为 myTask 的任务。

注意:buildSrc 目录下的代码是按照相同的构建流程进行编译和执行的,因此您可以在该目录下使用任何 Gradle API 和依赖。另外,buildSrc 目录会自动添加到构建脚本的 classpath 中,因此您可以在项目的其他构建脚本中直接使用 buildSrc 目录下的代码。

四. Java Library 插件配置

下面的图表描述了在使用 Java Library 插件时如何设置配置:

  • 绿色配置是用户应该用于声明依赖关系的配置。
  • 粉色配置是组件在编译或与库运行时使用的配置。
  • 蓝色配置是组件内部使用的配置,仅供其自身使用。

下一个图表描述了测试配置的设置:

表1,Java Library 插件,用于声明依赖关系的配置:

配置名称

作用

可消

耗性

可解

析性

描述
api声明API依赖关系在这里声明传递导出到消费者的依赖关系,用于编译时和运行时。
implementation声明实现依赖关系在这里声明纯粹为内部使用而不打算向消费者公开的依赖关系(在运行时仍然对消费者公开)。
compileOnly声明仅编译依赖关系在这里声明在编译时需要但在运行时不需要的依赖关系。这通常包括在运行时找到时会被屏蔽的依赖关系。
compileOnlyApi声明仅编译API依赖关系在这里声明模块和消费者在编译时需要但在运行时不需要的依赖关系。这通常包括在运行时找到时会被屏蔽的依赖关系。
runtimeOnly声明运行时依赖关系在这里声明仅在运行时需要而不在编译时需要的依赖关系。
testImplementation测试依赖关系在这里声明用于编译测试的依赖关系。
testCompileOnly声明仅测试编译依赖关系在这里声明仅在测试编译时需要但不应泄露到运行时的依赖关系。这通常包括在运行时找到时会被屏蔽的依赖关系。
testRuntimeOnly声明测试运行时依赖关系在这里声明仅在测试运行时需要而不在测试编译时需要的依赖关系。

表2,Java Library插件,消费者使用的配置:

配置名称作用

可消

耗性

可解

析性

描述
apiElements用于编译此库此配置用于供消费者检索编译此库所需的所有元素。
runtimeElements用于执行此库此配置用于供消费者检索运行此库所需的所有元素。

表3,Java Library插件,库本身使用的配置:

五. 构建 SpringBoot 多模块项目

5.1. 项目结构

-GradleMultiModule
  -GradleParent          包装common、util的父模块(实际中可以不要,这里演示导包、传递依赖等)
    -GradleCommon         公共模块,用于装entity或者mapper等
    -GradleUtil           工具类模块
  -GradleServer          业务模块的父模块,用于给子模块统一导入springboot的包
    -GradleOne            业务模块1 - 依赖GradleCommon、GradleUtil
    -GradleTwo            业务模块2 - 依赖
    -GradleStart          启动模块 - 导入GradleOne、GradleTwo依赖,启动项目

5.2. GradleMultiModule 模块

顶级父模块,统一配置 build.gradle(还可以配置gradle的版本),配置所有模块的关系。

build.gradle 配置:

//插件
plugins {
    id 'java'
    id 'idea'
    id 'java-library'
    id 'org.springframework.boot' version '2.7.15'
    id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}
 
//allprojects:所有模块生效
allprojects {
    // 配置项目信息
    group = 'com.cc'
    version = '0.0.1-SNAPSHOT'
    // 配置字符编码
    tasks.withType(JavaCompile).configureEach {
        options.encoding = 'UTF-8'
    }
 
    java {
        sourceCompatibility = '8'
        targetCompatibility = '8'
    }
 
    //仓库配置
    repositories {
        //本地
        mavenLocal()
        //阿里仓库
        maven { url 'https://maven.aliyun.com/repository/public/' }
        //公司仓库。必须用:https。Gradle默认情况下不允许使用不安全的协议,以提高安全性。
        maven { url 'https://******:****/repository/maven-public/' }
        //中央仓库
        mavenCentral()
    }
 
}
 
//subprojects:所有子模块生效——springboot配置、导包版本管理、打包管理
subprojects {
    apply plugin: 'java'
    apply plugin: 'java-library'
    apply plugin: 'idea'
    //所有子模块都是springboot项目,如不是,不能打包。
    apply plugin: 'org.springframework.boot'
    apply plugin: 'io.spring.dependency-management'
 
    //所有子模块的-依赖版本管理
    dependencyManagement {
        dependencies {
            dependency 'cn.hutool:hutool-all:5.0.7'
            dependency "org.apache.commons:commons-lang3:3.5"
        }
    }
 
    //使用 gradle打包工具
    jar {
        manifest.attributes provider: 'gradle'
    }
 
    tasks.named('test') {
        useJUnitPlatform()
    }
 
}
 
// 配置gradle的版本
wrapper {
    //gradle的版本
    gradleVersion = '8.6'
    //版本类型:BIN、ALL(完全版,可以看gradle的代码)
    distributionType = 'ALL'
}

settings.gradle 配置:

rootProject.name = 'GradleMultiModule'
 
//公共模块总模块
include 'GradleParent'
include ':GradleParent:GradleCommon'
include ':GradleParent:GradleUtil'
project(':GradleParent:GradleCommon')?.name = 'GradleCommon'
project(':GradleParent:GradleUtil')?.name = 'GradleUtil'
 
//业务模块总模块
include 'GradleServer'
include ':GradleServer:GradleStart'
include ':GradleServer:GradleOne'
include ':GradleServer:GradleTwo'
project(':GradleServer:GradleStart')?.name = 'GradleStart'
project(':GradleServer:GradleOne')?.name = 'GradleOne'
project(':GradleServer:GradleTwo')?.name = 'GradleTwo'

5.3. GradleParent 模块(公共)

统一公共模块依赖。

build.gradle 配置:

// 配置所有子模块
subprojects {
    // 这里可以导入公共的依赖
    dependencies {
        // compileOnly:这样做可以确保Lombok在编译时可用,但不会包含在最终的构建产物中,从而减小构建产物的大小。
        // api:依赖可以传递给子模块
        // compileOnlyApi:仅编译时可用,不包含在构建产物中,并且可以传递给子模块
        compileOnlyApi 'org.projectlombok:lombok'
        // 表示将Lombok库作为注解处理器导入。
        annotationProcessor 'org.projectlombok:lombok'
    }
}

5.4. GradleCommon 模块(公共)

公共模块,存放Entity。

build.gradle 配置:

dependencies {
    // api可以传递依赖、implementation不能传递依赖
    // hutool工具类
    api 'cn.hutool:hutool-all'
}

5.5. GradleUtil 模块(公共)

存放所有工具类。

build.gradle 配置:

dependencies {
    // api可以传递依赖、implementation不能传递依赖
    api 'org.apache.commons:commons-lang3'
}

5.6. GradleServer 模块(业务)

业务模块的父模块,用于统一导入 SpringBoot 的包。

build.gradle 配置:

// 子模块生效
subprojects {
    // 配置子模块依赖
    dependencies {
        // 导入业务模块的公共包 - SpringBoot的包
        // 不用api,不用传递
        implementation 'org.springframework.boot:spring-boot-starter'
        implementation 'org.springframework.boot:spring-boot-starter-web'
        testImplementation 'org.springframework.boot:spring-boot-starter-test'
    }
}

5.7. GradleOne 模块(业务)

引入 GradleCommon、GradleUtil 模块,测试是否能使用引入模块的类、引入模块的依赖。

build.gradle 配置:

dependencies {
    // 依赖公共模块
    // api传递给子模块
    api project(":GradleParent:GradleCommon")
    api project(":GradleParent:GradleUtil")
}

5.8. GradleTwo 模块(业务)

引入 GradleCommon、GradleUtil 模块,测试是否能使用引入模块的类、引入模块的依赖。

build.gradle 配置:

dependencies {
    // 依赖公共模块:implementation不传递依赖;api传递依赖
    // 这里不传递依赖,因为会造成GradleStart有多个重复依赖
    implementation project(":GradleParent:GradleCommon")
    implementation project(":GradleParent:GradleUtil")
}

5.9. GradleStart 启动模块(业务)

引入所有业务模块,启动springboot项目。

build.gradle 配置:

dependencies {
    // 依赖GradleOne、GradleTwo,将该模块纳入启动中(加入springboot项目中)
    api project(':GradleServer:GradleOne')
    api project(':GradleServer:GradleTwo')
 
    // 其他依赖项...
}

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

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

相关文章

计算机网络——28自治系统内部的路由选择

自治系统内部的路由选择 RIP 在1982年发布的BSD-UNIX中实现Distance vector算法 距离矢量:每条链路cost 1,# of hops(max 15 hops)跳数DV每隔30秒和邻居交换DV,通告每个通告包括:最多25个目标子网 RIP通告 DV:在…

Qt笔记-解决Qt程序连不上数据库MySQL数据库(重编libqsqlmysql.so)

使用QSqlDatabase连接MySQL数据库时。在自己程序配置没有错误的情况下报这类错误: QSqlDatabase: QMYSQL driver not loaded QSqlDatabase::exec: database not open 造成这样的问题大多数是libqsqlmysql.so有问题。 Qt的QSqlDatabase使用的是libqsqlmysql.so&a…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《偏远地区能源自洽系统源储容量协同配置方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

HTTP 常见面试题(计算机网络)

HTTP 基本概念 一、HTTP 是什么? HTTP(HyperText Transfer Protocol) :超文本传输协议。 HTTP 是一个在计算机世界里专门在「两点」之间「传输」文字、图片、音频、视频等「超文本」数据的「约定和规范」。 「HTTP 是用于从互联网服务器传输超文本到本…

《FFmpeg开发实战:从零基础到短视频上线》出版后记

在软件开发行业当中,音视频是比较小众的方向,以至于很多程序员都没听说过YUV,就更别说了FFmpeg。实际上FFmpeg很早就有了,只是它采用C语言编写,所以在WEB当道的国内软件业中,FFmpeg就像独孤求败那样&#x…

PVE设置显卡直通(二:Linux显卡直通,以及Linux系统下安装cuda库)

PVE设置显卡直通(一:硬件设置) 本文仅记录PVE关于Linux下的显卡直通步骤 例程不过多阐述 ps: 无直通经验的同学,先参阅 PVE设置显卡直通(一:硬件设置),再参阅本博文 参阅完成 PVE设置显卡直通(一:硬件设置)后,直接在PVE面板中添加显卡硬件到自己的主机即可,此文中…

JavaScript(二)---【js数组、js对象、this指针】

零.前言 JavaScript(一)---【js的两种导入方式、全局作用域、函数作用域、块作用域】-CSDN博客 一.js数组 在js中也有数组的概念,数组使用“[]”定义,其中数组中还可以嵌套数组从而达到多层数组的作用。 访问数组中的某个元素,我们可以直…

什么是HTTP? HTTP 和 HTTPS 的区别?

文章目录 一、HTTP二、HTTPS三、区别参考文献 一、HTTP HTTP (HyperText Transfer Protocol),即超文本运输协议,是实现网络通信的一种规范 在计算机和网络世界有,存在不同的协议,如广播协议、寻址协议、路由协议等等… 而HTTP是…

【Vue】搭建第一个vue3+vite前段项目

不要奇怪我为啥突然开始写前端的文章,唉,一切都是公司的任务罢了。 其实这周学习了前端和coverity,但是后者就算学了我也不能写在我博客里,所以还是写一写前端吧。 node.js 和 npm npm是一个类似于 maven 的包管理器。 去以下…

55 npm run serve 和 npm run build 的分包策略

前言 这里我们来看一下 vue 这边 打包的时候的一些 拆分包的一些策略 我们经常会使用到 npm run build 进行服务的打包 然后 打包出来的情况, 可能如下, 可以看到 chunk-vendors 是进行了包的拆分, 我们这里就是 来看一下 这里 npm run build 的时候的, 一个分包的策略 测试…

【Leetcode每日一题】模拟 - 提莫攻击(难度⭐)(45)

1. 题目解析 题目链接:495. 提莫攻击 2.算法原理 一、分情况讨论 要计算中毒的总时长,我们需要考虑时间点之间的差值,并根据这些差值来确定中毒的实际持续时间。 情况一:差值大于等于中毒时间 假设你的角色在时间点A中毒&#…

C语言 | Leetcode C语言题解之两数相加

题目: 题解: struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {struct ListNode *head NULL, *tail NULL;int carry 0;while (l1 || l2) {int n1 l1 ? l1->val : 0;int n2 l2 ? l2->val : 0;int sum n1 n2 …

C#(winform) 调用MATLAB函数

测试环境 VisualStudio2022 / .NET Framework 4.7.2 Matlab2021b 参考:C# Matlab 相互调用 Matlab 1、编写Matlab函数 可以没有任何参数单纯定义matlab处理的函数,输出的数据都存在TXT中用以后期读取数据 function [result,m,n] TEST(list) % 计算…

上海亚商投顾:沪指低开高走 5.5G概念股午后走强

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 沪指3月 29日震荡反弹,尾盘涨幅扩大至1%,深成指、创业板指跟随上扬。周期股再度走强&a…

基于SpringBoot+Vue企业级工位管理系统(源码+部署说明+演示视频+源码介绍+lw)

您好,我是码农飞哥(wei158556),感谢您阅读本文,欢迎一键三连哦。💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通…

Modbus取数测试程序

modbus协议,modbus-tcp协议取数测试程序 Java实现modbus-tcp协议取数操作,数据类型转换操作

list(链表)容器(一)

一、list基本概念 链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的 链表的组成:链表由一系列结点组成 结点的组成:一个是存储数据元素的数据域&#xff0…

Mac OS上使用matplotlib库显示中文字体

文章目录 问题描述解决步骤参考文章 问题描述 如果我们想要使用matplotlib画图的话,可能会出现下面的这种warning: UserWarning: Glyph 24212 (\N{CJK UNIFIED IDEOGRAPH-5E94}) missing from current font.解决步骤 解决这个问题,可以按照下面的做法…

【Leetcode】331. 验证二叉树的前序序列化

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接🔗 序列化二叉树的一种方法是使用 前序遍历 。当我们遇到一个非空节点时,我们可以记录下这个节点的值。如果它是一个空节点,我们可以使用一个标记值记录&#x…

Tidb和MySQL性能简单测试对比

一、单SQL性能对比 由于TiDB的并发能力优秀,但是单个SQL执行延迟较差,为了客观对比,所以只用1个线程来压测tidb和mysql,以观察延迟情况 二、并发SQL性能对比 TiDB:v6.5.2 MySQL:8.0.26 (单机) 三、结论 …