Gradle v8.5 笔记 - 从入门到进阶(基于 Kotlin DSL)

news2025/2/24 3:40:40

目录

一、前置说明

二、Gradle 启动!

2.1、安装

2.2、初始化项目

2.3、gradle 项目目录介绍

2.4、Gradle 项目下载慢?(万能解决办法)

2.5、Gradle 常用命令

2.6、项目构建流程

2.7、设置文件(settings.gradle.kts)

2.8、构建脚本(build.gradle.kts)

Project 对象属性

插件部分

插件配置

application 插件,生成可执行程序

仓库管理

依赖管理

2.9、自定义任务

2.10、生命周期钩子

2.11、项目发布


一、前置说明


Ps:如果不是因为某种必须原因,建议学习 Maven 即可,Gradle 的学习成本比 Maven 要高很多...

所需要具备的前置知识:

  1. 熟悉 SpringBoot
  2. 熟悉 Kotlin 语言.
  3. 熟悉 Maven 依赖管理
  4. 微服务(多项目配置会讲到)

二、Gradle 启动!


2.1、安装

a)安装之前,确保安装好 Java 环境,版本不能低于 Java 8(这种远古版本就别用了),本文使用 Java 17 .

b)进入 Gradle 官网下载 Gradle 8.5 版本(Gradle 版本兼容性很差,不同版本差异很大,不建议轻易更换),选择以编译好的 二进制 文件即可.

 官网下载地址如下:

https://gradle.org/releases/?_gl=1*bycxul*_ga*MTkwMDMxNTMyMS4xNzAzNjkxNjA5*_ga_7W7NC6YNPT*MTcwMzc2MDE2OS4yLjEuMTcwMzc2MTE0OS4zNi4wLjA.

 c)下载完后,解压,建议放到 C:/Program Files 目录下

d)配置环境变量:

e)打开命令窗口,输入 gradle -v 查看配置是否生效:

2.2、初始化项目

a)打开 cmd 窗口,执行以下命令来初始化项目:

gradle init

b)出现以下内容让我们初始化项目类型,选择 2 应用类型.

c)本文统一使用 Kotlin 语言讲解,选择 4 号:

d)是否生成多个子项目结果.  这里我们先以最简单的单体项目来进行讲解,选择 no 即可:

e)选择编写 gradle 脚本采用的语言,这里使用 Kotlin 语言(也是官方推荐的语言):

f)指定当前项目的名称以及包名,默认是当前目录的名字.

g)选择 Java 版本,这里使用 Java17,输入 17 即可.

h)是否选择使用新特性,选择 no 就可以了(gradle 的兼容性真的很差...),这样就完成了初始化.

 Ps:不同版本的 Gradle 对 IDEA 版本同样存在兼容性的问题,推荐使用 IDEA 2023.3 或者更高的版本.

i)使用 IDEA 打开这个项目,打开后会进行初始化,报考 Gradle 当前版本,以及所需要的依赖包和 Kotlin 相关库.

但是我们本地不是已经安装 gradle 了么,为什么又要下载一次?

这是由于  gradle wrapper 的作用.  因为 gradle 的跨版本兼容性很差,所以她指定了当前项目使用的 gradle 版本,让不同开发人员或者 CI/CD 系统都能使用相同的 gradle 版本来构建项目.  gradle wrapper 还有另外一个好处,它可以自动下载和使用正确版本的 gradle,无需手动安装或者配置 gradle,使得团队协作更加方便.  后续别人拿到这个项目的时候,不需要再系统中重新部署 gradle 环境.

如果初始化出现以下错误:

说明你之前配置过 gradle ,只需要去 file -> settings 中配置一下以下信息即可

2.3、gradle 项目目录介绍

  1. .gradle:Gradle自动生成的项目缓存目录。
  2. .idea:这个是IDEA的项目配置目录,跟Gradle生成的没关系,无视掉就行。
  3. app:存放整个项目的源代码、测试等,这里面就是我们写代码的地方了(使用 gradle 命的方式创建会出现此模块,如果使用 IDEA 创建,则不会出该现模块)。
    1. build.gradle.kts:项目的gradle构建脚本。
    2. src:存放源代码和测试代码。
      1. main:编写所有项目核心代码。
      2. test:编写项目测试代码。
  4. gradle:包含JAR文件和Gradle Wrapper的配置。
  5. gradlew:适用于macOS和Linux的使用Gradle Wrapper执行构建的脚本(这里的版本就是GradleWrapper指定的版本)
  6. gradlew.bat:适用于Windows的使用Gradle Wrapper执行构建的脚本。
  7. settings.gradle.kts:定义子项目列表的项目配置文件,也是最关键的设置文件。

gradle 在创建项目的时候给我们生成了一个主类用来测试:

class App {
    val greeting: String
        get() {
            return "Hello World!"
        }
}

fun main() {
    println(App().greeting)
}

可以看到如下运行结果:

2.4、Gradle 项目下载慢?(万能解决办法)

腾讯云做的国内镜像:

https://mirrors.cloud.tencent.com/gradle/

a)解决 gradle 不同版本下载慢的问题:修改当前项目的 gradle/wrapper/gradle-wrapper.properties 文件,位置如下:

修改内容如下:

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
# 1.默认走如下地址,由于停止了国内的 CDN,下载速度特别慢
# distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip
# 2.因此,可以使用腾讯云提供的镜像,下载速度极快
distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.5-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

b)解决依赖包下载慢的问题:使用 阿里云 的镜像网站即可.

repositories {
    maven {
        setUrl("https://maven.aliyun.com/repository/public")
    }
    mavenCentral()
}

2.5、Gradle 常用命令

gradle 的构建项目的命令就是通过前面我们讲到 gradle 初始化的项目中包含两个构建脚本实现的,分别是  gradle 和 gradle.bat,前者是 mac 系统适用,后者是 win 系统适用.

a)首先来看一下 gradle 支持的所有任务,可以通过以下命令来执行.

./gradlew.bat task

task 中包含了大量的命令操作,如下:

PS D:\codeRepositories\Gitee\java\gradle_test> .\gradlew.bat task
Downloading https://mirrors.cloud.tencent.com/gradle/gradle-8.5-bin.zip
............10%.............20%............30%.............40%.............50%............60%.............70%.............80%............90%.............100%
Starting a Gradle Daemon, 1 incompatible and 1 stopped Daemons could not be reused, use --status for details
Directory 'D:\JDK8' (Windows Registry) used for java installations does not exist
Directory 'D:\JDK8' (Windows Registry) used for java installations does not exist
<==
> Task :tasks

------------------------------------------------------------
Tasks runnable from root project 'gradle_test'
------------------------------------------------------------

Application tasks
-----------------
run - Runs this project as a JVM application

Build tasks
-----------
assemble - Assembles the outputs of this project.
build - Assembles and tests this project.
buildDependents - Assembles and tests this project and all projects that depend on it.
buildKotlinToolingMetadata - Build metadata json file containing information about the used Kotlin tooling
buildNeeded - Assembles and tests this project and all projects it depends on.
classes - Assembles main classes.
clean - Deletes the build directory.
jar - Assembles a jar archive containing the classes of the 'main' feature.
kotlinSourcesJar - Assembles a jar archive containing the sources of target 'kotlin'.
testClasses - Assembles test classes.

Build Setup tasks
-----------------
init - Initializes a new Gradle build.
wrapper - Generates Gradle wrapper files.

Distribution tasks
------------------
assembleDist - Assembles the main distributions
distTar - Bundles the project as a distribution.
distZip - Bundles the project as a distribution.
installDist - Installs the project as a distribution as-is.

Documentation tasks
-------------------
javadoc - Generates Javadoc API documentation for the 'main' feature.

Help tasks
----------
buildEnvironment - Displays all buildscript dependencies declared in root project 'gradle_test'.
dependencies - Displays all dependencies declared in root project 'gradle_test'.
dependencyInsight - Displays the insight into a specific dependency in root project 'gradle_test'.
help - Displays a help message.
javaToolchains - Displays the detected java toolchains.
kotlinDslAccessorsReport - Prints the Kotlin code for accessing the currently available project extensions and conventions.
outgoingVariants - Displays the outgoing variants of root project 'gradle_test'.
projects - Displays the sub-projects of root project 'gradle_test'.
properties - Displays the properties of root project 'gradle_test'.
resolvableConfigurations - Displays the configurations that can be resolved in root project 'gradle_test'.
tasks - Displays the tasks runnable from root project 'gradle_test' (some of the displayed tasks may belong to subprojects).

Verification tasks
------------------
check - Runs all checks.
checkKotlinGradlePluginConfigurationErrors - Checks that Kotlin Gradle Plugin hasn't reported project configuration errors, failing otherwise. This task always runs before compileKotlin* or similar tasks.
test - Runs the test suite.

To see all tasks and more detail, run gradlew tasks --all

To see more detail about a task, run gradlew help --task <task>

BUILD SUCCESSFUL in 34s
1 actionable task: 1 executed
PS D:\codeRepositories\Gitee\java\gradle_test> 

这里我们主要来看一下下图中的命令:

b)task 中的第一个 run 命令会自动编译和运行项目,拿出来单独执行,效果如下:

c)如果将来我们修改了项目的内容,需要重新编译,就要先进行 clean 进行清理

d)编写号 Java 项目之后,第一步就是编译成 class 文件

./gradlew classes

 此时就会在 app 目录下生成一个 build 目录,此目录中就存在的是编译之后的文件了.

e)有些时候我们不想执行测试,只想构建整个项目,可以添加参数跳过:

./gradlew build -x test

f)但是这样敲命令太烦人了,IDEA 中已经包含了 Gradle 插件,可以直接使用:

2.6、项目构建流程

gradle 项目构建流程:

2.7、设置文件(settings.gradle.kts)

a)settings.gradle.kts 是整个 Gradle 项目的入口,用来定义所有子项目,让他们参与到构件中. 

因此:

  • 对于单个项目构建,settings.gradle.kts 是可选的.
  • 对于多项目构建,settings.gradle.kts 文件必须存在,并配置定义所有的子项目.

b)settings.gradle.kts 文件中,gradle 会默认实例化一个  Settings 对象,所有项目声明都是通过她来实现的.

settings.rootProject.name = "demo1"

也可以省略掉 settings.

rootProject.name = "demo1"

c)Settings 对象

包含如下常用属性:

属性描述
buildCache项目构建所用缓存配置。
plugins用于设置的插件。
rootDir项目构建的根目录,根目录是整个项目目录最外层。
rootProject构建的根项目。
settings返回设置对象。

包含以下方法可以调用: 

方法描述
include()将指定名称的项目添加到构建列表中。
includeBuild()添加指定路径上的其他Gradle项目到构建列表中。

d)一般 Gradle 设置文件按照如下方式编写:

// 当前项目的名称
rootProject.name = "demo1"

//每个子模块的名称(没有子模块可以不写)
include("aaa")
include("bbb")
include("ccc")

e)配置文件中的内容,本质是对 Gradle API 方法的调用,结合 Kotlin 中 {...} 语法(Kotlin 中称为 lambda) 

2.8、构建脚本(build.gradle.kts)

Project 对象属性

在每一个 build.gradle.kts 文件中,Gradle 都会为其创建一个 Project 实例对象,可以直接使用.

group = "com.cyk"
version = "1.0-SNAPSHOT"

当然,也可以省略 project

group = "com.cyk"
version = "1.0-SNAPSHOT"

此对象中,还包含以下常见属性

属性类型描述
nameString项目目录的名称。
pathString该项目的完全限定名称。
descriptionString该项目的描述。
layoutProjectLayout通过此对象来访问项目中的关键位置。

另外常用属性还有一些是以 lambda 的形式来编写的,往下走~

插件部分

plugins {
    kotlin("jvm") version "1.9.21"
    application
}

//也可以写成以下形式
plugins {
    id("org.jetbrains.kotlin.jvm") version "1.9.21"
    id("application")
}

kotlin 表示整个项目的所使用的插件,而 application 是由官方内置的插件,可以不用指定 version ,而 kotlin 未被官方内置,所以需要手动指定 version ,Gradle 才能在仓库中找到她.

插件配置

另外还可以对这些插件进行一些配置,例如编译的目标版本是 jdk17

tasks.withType<KotlinCompile> {
    kotlinOptions.jvmTarget = "17"
}

application 插件,生成可执行程序

使用 application 插件,它包含 java 插件的全部功能,同样支持编译和打包,并且支持生成可执行的应用程序.

plugins {
    kotlin("jvm") version "1.9.21"
    application //引入 application 插件
}

application {
    //配置主类(build.classes.kotlin 目录下的绝对路径)
    //注意: Main.kt 编译后生成的字节码文件名为 MainKt
    //指导生成可执行程序执行的入口
    mainClass.set("com.cyk.kt.MainKt")
}

通过 build 命令构建以后,可以看到 application 插件生效了,生成了如下文件:

这里我们只需要解压缩,就能看到 application 插件生成的可执行程序:

进入 bin 目录

双击运行 demo1.bat 即可运行(建议可以先打开终端,再打开该程序,否则程序一闪而过)

也可以直接通过 idea 提供的插件,直接运行可执行程序,如下

仓库管理

初始化 Gradle 项目之后,默认是选择 Maven 中央仓库,下载速度极慢(慢到即使有梯子也不行,因为 Gradle 关闭了国内的 cdn)

repositories {
    mavenCentral()
}

为了解决上述问题,我们一般都是优先使用本地仓库,本地仓库没有,再去阿里云仓库(速度快),最后在考虑中央仓库.

repositories {
    mavenLocal() //本地仓库
    maven {
        setUrl("https://maven.aliyun.com/repository/public") //阿里云仓库(第三方仓库)
    }
    mavenCentral() //中央仓库
}

依赖管理

a)这里可以使用以下函数导入依赖:

  • implementation:导入依赖,用于编译和运行生产代码。
  • testImplementation:导入依赖,用于编译和运行测试代码。
  • runtimeOnly:仅在运行时可用,比如 MySQL 驱动这类我们不需要在项目中直接使用,但是在项目运行时有需要用到的依赖.
  • api:与 implementation 类似,但是会暴露依赖项给项目所有模块(多项目配置中详解)
  • compileOnly:表示导入的依赖只在编译时可用,编译完后不会将依赖打包.
  • kapt:用于添加 Kotlin 注解处理器依赖项。
  • annotationProcessor:用于添加 Java 注解处理器依赖项。
  • androidTestImplementation:用于添加Android测试时需要的依赖项。

b)函数的参数就是一个字符串,就是我们依赖的组、名称、版本号:

  • org.junit:junit-bom:5.9.1 对应的组为 org.junit,依赖名称为:junit-bom,版本号为:5.9.1

c)使用 implementation 添加依赖的步骤:

  1. 去 https://mvnrepository.com/ 找到所需要的包
  2. 直接复制粘贴到项目中
dependencies {
    testImplementation(kotlin("test"))
    implementation("org.springframework.boot:spring-boot-starter:2.6.7")
}

另外,还可以分开编写 组、名称、版本,提高可读性:

dependencies {
    testImplementation(kotlin("test"))
    implementation("org.springframework.boot", "spring-boot-starter","2.6.7")
}

在使用依赖时,我们可能需要排除某些不需要的依赖,或者与其他依赖冲突,我们也可以对依赖进行排除操作:

dependencies {
    testImplementation(kotlin("test"))
    implementation("org.springframework.boot", "spring-boot-starter","2.6.7") {
        //以 lambda 的形式排除依赖
        exclude("org.springframework.boot", "spring-boot-starter-logging")
    }
}

2.9、自定义任务

a)Gradle 上一个工作由多个任务来完成,比如构建、编译、清理... 这些任务都由插件提供.

不引入任何插件的情况下,只有一些内置任务:

b)引入 Kotlin / Java 插件之后,就出现了 编译、构建、打包... 等任务.

plugins {
    kotlin("jvm") version "1.9.21"
    application //引入 application 插件
}

c)如果觉得插件提供的任务不够,还可以在 build.gradle.kts 中自定义添加.

注册任务需要使用 register 或 create 函数来完成,例如如下:

tasks.register("hi~") {//第一个参数是任务名称,第二个参数是 lambda 编写的具体任务
    //任务包含一个完整的操作列表,需要传入对应的 Action 到队列中,这样便会依次执行
    doFirst { //向队列首部插入 Action
        println("自定义任务开始!")
    }
    doLast { //向队列尾部插入 Action
        println("自定义任务结束!")
    }
}

刷新之后就出现了我们自定义的任务 

效果如下:

我们甚至还可以配置此任务所属的组,以及描述信息: 

d)另外我们还可以指定自定义任务的前置任务,例如但我们点击自定义任务时,先执行 build 命令,如下:

tasks.register("hi~") {//第一个参数是任务名称,第二个参数是 lambda 编写的具体任务
    group = "build"
    description = "自定义任务~"
    //指定前置任务为 build
    dependsOn(tasks.build)
    doFirst { //向队列首部插入 Action
        println("task start~")
    }
    doLast { //向队列尾部插入 Action
        println("task end~")
    }
}

手动执行自定义任务后,自动先触发 build 命令

e)当然,返回来也可以,例如我们执行 build 命令时,会先自动执行自定义任务:

f)在 gradle 中,所有任务都是 Task 子类,除了上述所写方式(register),我们也可以自己创建 Task 子类,用来编写自定义任务类型:

//继承 DefaultTask 来创建一个自定义的 HiTask 类
//这个类要么是可继承,要么是 open,要么是抽象类
open class HiTask: DefaultTask() {
    private var name: String = ""

    fun user(name: String) {
        this.name = name
    }

    @TaskAction //添加@TaskAction 注解来声明此函数为任务
    fun hi() {
        println("${name}: 最帅!")
    }

}

//使用 register 来指明我们自定义的任务类型
tasks.register<HiTask>("hi") {
    this.user("cyk") //此时 this 就是 HiTask
}

 效果如下: 

g)Gradle 还提供了一些内置任务类型,例如复制任务: 

tasks.register<Copy>("hello") {   //这里使用Copy类型
    from("build/classes")   //使用from和into设置复制的目录和目标位置
    into("test")
  	dependsOn(tasks.build)   //依赖一下build
}

2.10、生命周期钩子

有时候我们希望在 Gradle 整个声明周期中不同时期执行一些操作,就可以使用钩子函数(类似 Vue 钩子).

  1. 构建初始阶段
    1. gradle.settingsEvaluated() 完成项目的配置阶段之后调用(只能定义在 setting.gradle 或 init.gradle 脚本中)
    2. gradle.projectsLoaded() 所有项目加载之后调用(只能定义在 setting.gradle 或 init.gradle 脚本中)
  2. 配置阶段
    1. gradle.beforeProject() 每个项目完成配置之前调用(只能定义在 setting.gradle 或 init.gradle 脚本中)
    2. gradle.afterProject() 每个项目完成配置之后调用
    3. gradle.projectEvaluated() 所有项目全部完成配置之后调用
    4. gradle.afterEvaluate() 整个配置阶段完成后调用
    5. gradle.taskGraph.whenReady 全部任务图已经构建完成可以就绪后调用
  3. 执行阶段
    1. gradle.taskGraph.beforeTask 执行每一个任务之前调用
    2. gradle.taskGraph.afterTask 每一个任务执行完成之后调用
    3. gradle.buildFinished 整个构建全部结束后调用

例如,我们可以利用这个特性来统计某一个任务的耗时:

2.11、项目发布

我们可以将自己的 Gradle 项目发布到 Maven 仓库中,这里以发布到本地仓库为例:

publishing {
    publications {
        //Maven 坐标信息
        create<MavenPublication>("library") {
            groupId = "com.cyk"
            artifactId = "demo1"
            version = "0.0.1"
            from(components["java"]) // jar 包发布
        }
    }

    //指定发布仓库
    repositories {
        mavenLocal()  //发布到本地 Maven 仓库
    }
}

执行 publish 命令即可发布到本地仓库(注意每次发布都更新一下版本号,防止仓库中优先执行缓存)

此时在 .m2 中就可以看到我们发布的项目了

待续...

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

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

相关文章

15|BabyAGI:根据气候变化自动制定鲜花存储策略

一种新型的代理——Autonomous Agents&#xff08;自治代 理或自主代理&#xff09;&#xff0c; 在 LangChain 的代理、工具和记忆这些组件的支持下&#xff0c;它们能够在无需外部干预的情况下自主 运行&#xff0c;这在真实世界的应用中具有巨大的价值。 AutoGPT 它的主要…

晶圆制造过程中常用载具的类型

晶圆载具用于硅片生产、晶圆制造以及工厂之间晶圆的储存、传送、运输以及防护。晶圆载具种类很多,如FOUP用于晶圆制造工厂中晶圆的传送;FOSB用于硅片生产与晶圆制造工厂之间的运输;CASSETTE载具可用于工序间运送以及配合工艺使用。 OPEN CASSETTE OPEN CASSETTE主要在晶圆…

机器视觉系统选型-镜头基础知识

广角镜头&#xff1a;焦距小于标准焦距50mm的。例如&#xff1a;16mm 景深大&#xff0c;聚焦距离更近 远距照像镜头&#xff1a;焦距大于标准焦距50mm的。例如&#xff1a;75mm 景深浅&#xff0c;放大远距离物体 变焦镜头&#xff1a;镜头焦距可调节&#xff0c;焦距有范围&a…

JWT(跨域身份验证解决方案)

Json web token (JWT), 跨域身份验证解决方案,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于…

学习总结!

最近主要学习了java&#xff0c;题目的话就写了两道。 这道题目运用三维的bfs&#xff0c;第一次做时无从下手&#xff0c;原来可以利用三维数组&#xff08;第一次用三维数组&#xff09;可以解决这类问题&#xff0c;然后套bfs模板即可。 #include<iostream> #include…

Pandas:如何让你的代码性能飙升

在数据分析相关的工作中&#xff0c;Pandas无疑是一个强大的工具&#xff0c;它的易用性和灵活性广受青睐。然而&#xff0c;随着数据量的不断增长和计算需求的日益复杂&#xff0c;Pandas代码的性能问题也逐渐浮出水面。如何让Pandas代码运行得更快、更高效&#xff0c;成为了…

电子科技大学链时代工作室招新题C语言部分---题号G

1. 题目 问题的第一段也是非常逆天&#xff0c;说实话&#xff0c;你编不出问题背景可以不编。 这道题的大概意思就是&#xff0c; Pia要去坐飞机&#xff0c;那么行李就有限重。这时Pia想到自己带了个硬盘&#xff0c;众所周知&#xff0c;硬盘上存储的数据就是0和1的二进制序…

StartAI创成式填充(扩图)功能使用教程 约等于Photoshop Beta 25.0

创成式填充&#xff0c;是基于原有图片进行扩展或延展&#xff0c;在保证图片合理性的同时实现与原图片的高度契合。StartAI PS智能AI插件通过【扩图】&#xff0c;【局部重绘】&#xff0c;【背景移除】等功能来实现PS的“创成式填充” StartAI当前最新版本&#xff1a;V0.7.…

rabbitmq-spring-boot-start配置使用手册

rabbitmq-spring-boot-start配置使用手册 文章目录 1.yaml配置如下2.引入pom依赖如下2.1 引入项目resources下libs中的jar包依赖如下2.2引入maven私服依赖如下 3.启动类配置如下4.项目中测试发送消息如下5.项目中消费消息代码示例6.mq管理后台交换机队列创建及路由绑定关系如下…

Maven项目如何导入依赖包

一、导入依赖包 导入mysql依赖包 第一步&#xff1a;登录Maven官网 Maven官网&#xff1a;https://mvnrepository.com/search?qmysql 第二步&#xff1a;点击MySql Connector Java 第三步&#xff1a;点击任意一个版本 第四步&#xff1a;将以下内容复制到pom.xml中 导入j…

【MATLAB源码-第165期】基于matlab的科莫多巨蜥算法(KMA)机器人栅格路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 科莫多巨蜥算法&#xff08;Komodo Mlipir Algorithm&#xff0c;简称KMA&#xff09;是一种受到印尼科莫多岛上独特生物——科莫多巨蜥启发的创新算法。尽管这个算法的名称听起来很有趣&#xff0c;但实际上它并不是一个公认…

【Godot4.2】2D导航04 - TileMap导航的逻辑

基于NavigationRegion2D 我们基于NavigationRegion2D的逻辑一文的场景结构&#xff0c;但是将NavigationRegion2D删除&#xff0c;更改为TileMap节点。 为TileMap创建Tileset&#xff0c;并创建一个导航层。在TileSet面板中&#xff0c;为草地和黄色泥土地面图块绘制可通行区…

PX4|基于FAST-LIO mid360的无人机室内自主定位及定点悬停

目录 前言环境配置运行fast-lio修改px4位置信息融合方式编写位置坐标转换及传输节点 前言 在配置mid360运行环境后&#xff0c;可使用mid360进行室内的精准定位。 环境配置 在livox_ros_driver2的上级目录src下保存fast-lio的工程 git clone https://github.com/hku-mars/F…

springboot企业级抽奖项目-整体展示

项目地址 GitHub - kiorr/lottery: 企业红包雨项目 star截图q&#xff1a;3353441618可以领取资料 原型效果 前台 后台 业务分析 项目介绍 项目概述 京东的红包雨大家可能都参与过&#xff0c;在某段时间内随机发放不同的红包 本项目为一个通用的红包雨模式抽奖系统&…

服务器端(Debian 12)配置jupyter与R 语言的融合

融合前&#xff1a; 服务器端Debian 12,域名&#xff1a;www.leyuxy.online 1.安装r-base #apt install r-base 2.进入R并安装IRkernel #R >install.packages(“IRkernel”) 3.通过jupyter notebook的Terminal执行&#xff1a; R >IRkernel::installspec() 报错 解决办…

【Godot4.2】2D导航01 - AStar2D及其使用方法

概述 对于2D平台跳跃或飞机大战&#xff0c;以及一些直接用键盘方向键操控玩家的游戏&#xff0c;是根本用不到寻路的&#xff0c;因为只需要检测碰撞就可以了。 但是对于像RTS或战棋这样需要操控玩家到地图指定位置的移动方式&#xff0c;就绝对绕不开寻路了。 导航、碰撞与…

堆排序(数据结构)

本期讲解堆排序的实现 —————————————————————— 1. 堆排序 堆排序即利用堆的思想来进行排序&#xff0c;总共分为两个步骤&#xff1a; 1. 建堆 • 升序&#xff1a;建大堆 • 降序&#xff1a;建小堆 2. 利用堆删除思想来进行排序. 建堆和堆删…

QCustomPlot-绘制X轴为日期的折线图

主要代码如下&#xff1a; void Widget::InitQLineXDateAddData() {customPlot new QCustomPlot(this);// 创建日期时间类型的刻度生成器QSharedPointer<QCPAxisTickerDateTime> dateTimeTicker(new QCPAxisTickerDateTime);dateTimeTicker->setDateTimeFormat(&quo…

基于python+vue智慧社区家政服务系统的设计与实现flask-django-nodejs

论文主要是对智慧社区家政服务系统进行了介绍&#xff0c;包括研究的现状&#xff0c;还有涉及的开发背景&#xff0c;然后还对系统的设计目标进行了论述&#xff0c;还有系统的需求&#xff0c;以及整个的设计方案&#xff0c;对系统的设计以及实现&#xff0c;也都论述的比较…

Kotlin进阶之协程从专家到出家

公众号「稀有猿诉」 原文链接 Kotlin进阶之协程从专家到出家 协程Coroutine是一种轻量级的实现异步的方式&#xff0c;是代码执行的控制框架&#xff0c;是最新式的并发编程范式。它在使用上大大简化了以往多线程并发带来的种种麻烦&#xff08;如状态同步和锁&#xff…