SpringBoot项目升级到3.*,并由JDK8升级到JDK21

文章目录

  • 技术选型说明
  • JDK21的Demo项目下载
  • 升级过程出现的问题及解决
    • 1、程序包javax.servlet.http不存在
      • 1.1、java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter
      • 1.2、javax.validation包替换为jakarta.validation
      • 1.3、jakarta的名字由来
    • 2、mybatis-plus升级
    • 3、mybatis-plus多数据源支持
    • 4、redis配置调整
    • 5、openfeign配置调整到spring.cloud下
    • 6、升级到swagger3
      • 6.1、swagger的新注解
      • 6.2、java.lang.NoSuchMethodError: 'boolean org.apache.commons.lang3.math.NumberUtils.isCreatable(java.lang.String)'
    • 7、No SLF4J providers were found.
  • 其它问题
    • import java.util.concurrent.TimeUnit 报错:
    • FeignClient 加 GetMapping,实际自动转POST发出
  • 单元测试
    • 步骤
    • 错误处理
      • java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test
      • 提示:Java.lang.Exception: No runnable methods
      • 测试类不支持注解:RequiredArgsConstructor
      • Caused by: org.springframework.cloud.commons.ConfigDataMissingEnvironmentPostProcessor$ImportException: No spring.config.import set
      • 启动测试时,Autowired注解的类为null

技术选型说明

前几个月搞新项目,做技术选型时,评估了一下,决定使用JDK21,主要的评估点:

  • JDK21已经出了LTS长期支持版本,而且按Oracle官方说明,是免费使用的:https://www.oracle.com/hk/java/technologies/downloads/#java21
    JDK 21 binaries are free to use in production and free to redistribute, at no cost, under the Oracle No-Fee Terms and Conditions (NFTC).
  • 从JDK8到JDK21,引入了很多的性能优化,包括GC改进,之前看到过一个性能评测,同样的代码,在JDK21也比JDK8下运行要快10%~30%,不过现在找不到那个链接了,不过google搜索一下还是有很多类似的性能评测文章的;
  • SpringBoot的3.*最新版本,已经不支持JDK8了,例如现在的Stable稳定版3.3.5,要求JDK17:https://docs.spring.io/spring-boot/system-requirements.html
    而SpringBoot2.*的商业支持只到2025年2月:https://spring.io/blog/2022/05/24/preparing-for-spring-boot-3-0
  • 拥有经常被别人安利的虚拟线程(我还没用过)
  • 新项目,没有任何历史债务,又是探索型项目,工期要求不那么急,那就让团队进步一下,搞吧。

最终决定选型:JDK21 + SpringBoot3.3.1
注:JDK21,有很多公司都推出了发行版,基本上都可以下载和使用,这里列举几个:

  • oralce推出的NFTC版本:https://www.oracle.com/hk/java/technologies/downloads/#java21
    NFTC是指:Oracle No-Fee Terms and Conditions许可
  • 微软LTS发行版:https://learn.microsoft.com/zh-cn/java/openjdk/download-major-urls#openjdk-21-lts
  • Eclipse发行版:https://adoptium.net/zh-CN/temurin/releases/
  • OpenLogic发行版:https://www.openlogic.com/openjdk-downloads

我在生产环境用的当然还是Oracle的版本了。

JDK21的Demo项目下载

为方便后续问题解决,或快速创建新的JDK21项目,
写了一个基于JDK21+ spring-boot-starter3.3.1 + spring-cloud-starter-openfeign4.1.2的项目,放在github上,
有兴趣可以下载:
https://github.com/youbl/study/tree/master/jdk21-demo

升级过程出现的问题及解决

1、程序包javax.servlet.http不存在

在Controller里,一般会使用HttpServletRequestHttpServletResponse
在JDK8配套的SpringBoot2.*里,依赖的引用是:import javax.servlet.http.HttpServletRequest
而在SpringBoot3依赖的引用是import jakarta.servlet.http.HttpServletRequest
其它javax.servlet.http依赖都同样调整即可,注意要确认pom.xml添加了如下依赖:

<dependency>
    <groupId>jakarta.servlet</groupId>
    <artifactId>jakarta.servlet-api</artifactId>
    <version>5.0.0</version>
</dependency>

注:代码中涉及javax的package,都要对应替换,下面举2个例子:

1.1、java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter

如果代码报这个错,也是需要修改依赖,从javax 改为 jakarta,在pom.xml里引入:

<dependency>
    <groupId>jakarta.xml.bind</groupId>
    <artifactId>jakarta.xml.bind-api</artifactId>
    <version>3.0.1</version>
</dependency>

但是,我在对接阿里云时,它们的SDK报这个错,那这个就没法改pom了,因为它们的SDK代码里写死了javax,此时只能把javax的依赖加回来了,在pom.xml里,添加:

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-core</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
</dependency>

1.2、javax.validation包替换为jakarta.validation

同样如果使用了spring的validation,对应的依赖也要换成jakarta:

<dependency>
    <groupId>jakarta.validation</groupId>
    <artifactId>jakarta.validation-api</artifactId>
    <version>3.0.2</version>
</dependency>

注:如果项目添加了下面的swagger依赖,那边自动集成了,就可以不需要自己加了。

1.3、jakarta的名字由来

当时觉得jakarta这个命名很山寨,特意查了一下由来,发现是我自己山寨了,参考维基百科:https://zh.wikipedia.org/wiki/Jakarta%E9%A1%B9%E7%9B%AE

Jakarta的名称与印度尼西亚的首都雅加达(Jakarta)并无直接关系,
实际上它是根据Sun Microsystems公司当时讨论创建这个项目时的会议室命名的。

另外,jakarta.ee官网也解释了这个命名的由来:https://jakarta.ee/about/faq/
那里也是引用了维基百科的会议室来源说法,并在2018年2月进行了投票,64%的人支持Jakarta EE这个命名。
而维基百科的Java_EE的页面没有找到相关说明:https://zh.wikipedia.org/wiki/Jakarta_EE

那为什么要改名呢?依据一些未经考证的说明,是因为Oracle把JavaEE移交给Eclipse基金会,同时不允许Eclipse基金会继续使用Java名号,所以才发起改名投票。

2、mybatis-plus升级

参考:https://github.com/baomidou/mybatis-plus
SpringBoot2用这个:

<!-- 这是SpringBoot2的 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.3.1</version>
</dependency>

而升级到SpringBoot3,要用这个artifactId:mybatis-plus-spring-boot3-starter

<!-- 这是SpringBoot3的 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
    <version>3.5.5</version>
</dependency>
<!-- 搭配的mysql驱动 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.28</version>
</dependency>

3、mybatis-plus多数据源支持

参考:https://github.com/baomidou/dynamic-datasource
SpringBoot3要使用如下依赖:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot3-starter</artifactId>
    <version>4.3.1</version>
</dependency>

4、redis配置调整

在SpringBoot2里,redis的yml配置写法如下:

spring:
  redis:
    host: localhost
    port: 6379
    database: 15
    password: 123456

升级到SpringBoot3后,redis的yml配置写法如下:

spring:
  data:
    redis:
      host: localhost
      port: 6379
      database: 15
      password: 123456

5、openfeign配置调整到spring.cloud下

在之前,feign的相关配置是这样的:

feign:
  client:
    config:
      default:
        logger-level: full

升级到SpringBoot3(对应spring-cloud-starter-openfeign4.1.2以上)后,相关的配置迁移了,参考: https://docs.spring.io/spring-cloud-openfeign/reference/spring-cloud-openfeign.html
新的配置是这样的:

spring:
  cloud:
    openfeign:
      client:
        config:
          default:
            logger-level: full

我在另一篇文章也做了代码断点调试来说明代码调用位置,参考:https://youbl.blog.csdn.net/article/details/109047987

6、升级到swagger3

在SpringBoot3项目的pom.xml里添加依赖,即可,启动项目使用地址:http://localhost:8080/swagger-ui.html
参考官网说明:https://springdoc.org/

<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
    <version>2.0.2</version>
</dependency>

如果想修改swagger api页面的介绍,可以在代码里定义如下Bean:

@Configuration
public class SwaggerApiConfig {
    // 参考官网:https://springdoc.org/
    @Bean
    public OpenAPI springOpenAPI() {
        Info info = new Info()
                .title("beinet.cn jdk21 API demo文档")
                .description("这是水边提供的jdk21代码demo,参考:https://youbl.blog.csdn.net/")
                .version("0.0.1") // 版本号
                .license(new License().name("Apache 2.0").url("https://youbl.blog.csdn.net/"));
        ExternalDocumentation doc = new ExternalDocumentation()
                .description("水边的Blog文档")
                .url("https://youbl.blog.csdn.net/");
        return new OpenAPI().info(info)
                .externalDocs(doc);
    }
}

注意:
如果项目报如下错误:
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'swaggerWebMvcConfigurer' defined in class path resource [org/springdoc/webmvc/ui/SwaggerConfig.class]: Unsatisfied dependency expressed through method 'swaggerWebMvcConfigurer' parameter 0: Error creating bean with name 'org.springdoc.core.properties.SwaggerUiConfigParameters': Failed to instantiate [org.springdoc.core.properties.SwaggerUiConfigParameters]: Constructor threw exception

这是因为内置的commons-lang3版本有问题,需要自定义版本,pom.xml参考:

<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
    <version>2.0.2</version>
    <exclusions>
        <exclusion>
            <artifactId>commons-lang3</artifactId>
            <groupId>org.apache.commons</groupId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.14.0</version>
</dependency>

6.1、swagger的新注解

相对于原来的swagger2,新的swagger3的注解全部换掉了,按官网说明,新旧注解对应关系如下:https://springdoc.org/#migrating-from-springfox

@Api → @Tag
@ApiIgnore → @Parameter(hidden = true) or @Operation(hidden = true) or @Hidden
@ApiImplicitParam → @Parameter
@ApiImplicitParams → @Parameters
@ApiModel → @Schema
@ApiModelProperty(allowEmptyValue = true) → @Schema(nullable = true)
@ApiModelProperty → @Schema
@ApiOperation(value = "foo", notes = "bar") → @Operation(summary = "foo", description = "bar")
@ApiParam → @Parameter
@ApiResponse(code = 404, message = "foo") → @ApiResponse(responseCode = "404", description = "foo")

但是实际我在应用中,发现也没有非常明确的对应关系,我的作法:

  • 一般在Dto上,统一使用@Schema注解,如:
@Data
@Accessors(chain = true)
@Schema(description = "用户数据")
public class UsersDto {
    @Schema(description = "用户id,主键")
    private Long id;
    
    @Size(max = 255)
    @Schema(description = "用户名称")
    private String name;
  • 在Controller类上,使用@Tag注解,类里的Mapping接口上,使用@Operation注解,如:
@RestController
@RequiredArgsConstructor
@Tag(name = "users", description = "用户增删改查接口类")
public class UsersController {
    private final UsersService service;

    @PostMapping("/users/all")
    @Operation(summary = "用户列表", description = "用户列表查询接口")
    public ResponseData<List<UsersDto>> findAll(@RequestBody UsersDto dto) {
        return ResponseData.ok(service.search(dto));
    }

效果如图,在页面上可以点击“Try it out”进行接口测试,类似于PostMan或Fiddler:
在这里插入图片描述

6.2、java.lang.NoSuchMethodError: ‘boolean org.apache.commons.lang3.math.NumberUtils.isCreatable(java.lang.String)’

如果swagger报如下错误:

java.lang.NoSuchMethodError: 'boolean org.apache.commons.lang3.math.NumberUtils.isCreatable(java.lang.String)'
	at io.swagger.v3.core.jackson.ModelResolver.resolveMinimum(ModelResolver.java:1831) ~[swagger-core-jakarta-2.2.7.jar:2.2.7]
	at io.swagger.v3.core.jackson.ModelResolver.resolveSchemaMembers(ModelResolver.java:2222) ~[swagger-core-jakarta-2.2.7.jar:2.2.7]
	at io.swagger.v3.core.jackson.ModelResolver.resolveSchemaMembers(ModelResolver.java:2177) ~[swagger-core-jakarta-2.2.7.jar:2.2.7]
	at io.swagger.v3.core.jackson.ModelResolver.resolve(ModelResolver.java:341) ~[swagger-core-jakarta-2.2.7.jar:2.2.7]

那么还是前面说的commons-lang3版本太低问题导致的,要按前面说的自定义升级方式指定高版本。
注:在实际项目中,出过这样一个问题:

  • 在子模块的<dependencies>添加并指定了3.14.0的版本;
  • 在父模块使用<dependencyManagement>指定了3.4.0的版本;
  • 最终构建的结果会使用3.4.0,导致启动报错,当时查了挺久才发现问题。

7、No SLF4J providers were found.

启动报错:

SLF4J(W): No SLF4J providers were found.
SLF4J(W): Defaulting to no-operation (NOP) logger implementation
SLF4J(W): See https://www.slf4j.org/codes.html#noProviders for further details.

通常是因为没有添加logging实现依赖,添加 spring-boot-starter-logging 引用解决:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
</dependency>

如果你的项目添加了spring-boot-starter-test,那应该不会报这个错。
注:也可以添加其它的依赖实现,格式会有点不好看就是了,参考:https://stackoverflow.com/questions/54652836/found-slf4j-api-dependency-but-no-providers-were-found

其它问题

import java.util.concurrent.TimeUnit 报错:

在idea中会标红,但是不影响使用,升级idea版本可以解决
参考:https://stackoverflow.com/questions/77551293/intellij-idea-jdk-21-issue-with-java-util-concurrent-package-timeunit-class

FeignClient 加 GetMapping,实际自动转POST发出

下面的feign定义,会自动转换为POST发请求,导出报错,路径不存在:

@GetMapping("/users")
ResponseData<UsersDto> pageIdentity(UsersDto dto);

因为默认情况下,feign会把复杂对象作为body进行提交,而http协议规范是不支持GET加body的,因此feign就自动转换为POST了。
解决办法,就是FeignClient不改,让调用的目标接口那边,改用PostMapping来接收body。
如果不改目标接口,在Feign的参数前加 @RequestParam 不能解决问题。

单元测试

步骤

以一个utils的工具类库demo项目为例,添加单元测试步骤:

1、test单元测试代码的目标结构:
在这里插入图片描述

  • 对utils项目的pom.xml,添加依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-test</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>5.10.3</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <scope>test</scope>
</dependency>
  • 在src目录2. 新建子目录: test/java
    注:test目录跟main目录是同级的
  • 在test下新建子目录:resources,并新建文件:application.yml,内容参考:
spring:
  application:
    name: beinet-utils
  profiles:
    active: local
  • 在test/java下新建package,必须跟main/java下的主java文件是相同package
  • 在该新建的package下,新建UtilsTestApplication 文件,内容参考:
    注:因为spring-boot的单元测试要求要有@SpringBootApplication定义的主类存在,而utils之类的项目一般没有
@SpringBootApplication(scanBasePackages = "cn.beinet")
public class UtilsTestApplication {
    public static void main(String[] args) {
        SpringApplication.run(UtilsTestApplication.class, args);
    }
}
  • 在该新建的package下,新建package为testHelper,再在其下新建单元测试类IpHelperTest.java 文件,内容参考:
package cn.beinet.core.utils.testHelper;

import cn.beinet.core.utils.UtilsTestApplication;
import org.junit.Assert;
import org.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest(classes = UtilsTestApplication.class)
public class IpHelperTest {
    @Test
    public void testDemo() {
        var ts = System.currentTimeMillis();
        Assert.assertTrue(ts > 1);
    }
}
  • OK,可以点击 testDemo左边的绿色小三角形,启动测试看看效果。

错误处理

java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=…) with your test

因为@SpringBootTest注解,默认会在当前package下查找主类(即有@SpringBootApplication注解的类)
找不到就会报错,要求在@SpringBootTest注解里指定主类的位置,如:
@SpringBootTest(classes = UtilsTestApplication.class)
可以在test/java下的package下新建一个主类,参考上面步骤

提示:Java.lang.Exception: No runnable methods

这是因为@Test 注解用错了,
正确的Test注解全路径是 org.junit.Test
如果import导入了错误的package,用了 org.junit.jupiter.api.Test 就会报这个错误

测试类不支持注解:RequiredArgsConstructor

如果用了这个注解,会报错:

org.junit.runners.model.InvalidTestClassError: Invalid test class 'xxx.HandleFactoryTest':
  1. Test class should have exactly one public zero-argument constructor

需要使用Bean时,在测试代码里,直接用 @Autowired 注解即可

Caused by: org.springframework.cloud.commons.ConfigDataMissingEnvironmentPostProcessor$ImportException: No spring.config.import set

这是因为项目依赖了配置中心,而yml中未指定配置中心的配置,需要在yml里指定一下,如:

spring:
  config:
    import: configserver:https://config-dev.beinet.cn

注意:其它必要的配置也不能遗漏,比如 spring.application.name

启动测试时,Autowired注解的类为null

如果单元测试依赖spring的Bean,则在该测试类上,必须添加注解:
@RunWith(SpringRunner.class)
如果不依赖Bean,则可以不需要该注解,以加快单元测试执行速度

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

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

相关文章

谈一谈QThread::CurrentThread和this->thread

QThread::CurrentThread是指的当前函数调用者者所在的线程 this->thread是指的当前对象所在的线程&#xff08;对象创建出来的时候所在的线程&#xff09; Qt文档说明 CurrentThread返回一个指向管理当前执行线程的QThread的指针 thread返回对象所在的线程 这两个函数所…

每日论文23-24ESSERC 6.4-16.1Ghz混合并联-串联谐振器

《A 6.4-to-16.1GHz Hybrid Parallel-Series Resonator Mode-Switching Oscillator with 206.6dBc/Hz FoMT at 1MHz Offset in 40nm CMOS》 24ESSERC 首先这篇文章有个地方我其实没太明白&#xff0c;它在title和行文的时候都写的是“ hybrid parallel-series resonator mode-…

数据结构C语言描述3(图文结合)--双链表、循环链表、约瑟夫环问题

前言 这个专栏将会用纯C实现常用的数据结构和简单的算法&#xff1b;有C基础即可跟着学习&#xff0c;代码均可运行&#xff1b;准备考研的也可跟着写&#xff0c;个人感觉&#xff0c;如果时间充裕&#xff0c;手写一遍比看书、刷题管用很多&#xff0c;这也是本人采用纯C语言…

深入理解Flutter生命周期函数之StatefulWidget(一)

目录 前言 1.为什么需要生命周期函数 2.开发过程中常用的生命周期函数 1.initState() 2.didChangeDependencies() 3.build() 4.didUpdateWidget() 5.setState() 6.deactivate() 7.dispose() 3.Flutter生命周期总结 1.调用顺序 2.函数调用时机以及主要作用 4.生…

uniapp vue3小程序报错Cannot read property ‘__route__‘ of undefined

在App.vue里有监听应用的生命周期 <script>// 只能在App.vue里监听应用的生命周期export default {onError: function(err) {console.log(AppOnError:, err); // 当 uni-app 报错时触发}} </script>在控制台打印里无意发现 Cannot read property ‘__route__‘ of …

ESP32移植Openharmony外设篇(5)aht20温湿度传感器

模块简介 产品概述 AHT20&#xff0c;新一代温湿度传感器在尺寸与智能方面建立了新的标准&#xff1a;它嵌入了适于回流焊的双列扁平无引脚SMD封装&#xff0c;底面 3 x 3mm &#xff0c;高度1.0mm。传感器输出经过标定的数字信号&#xff0c;标准 I2 C 格式。 AHT20 配有一个…

量子计算来袭:如何保护未来的数字世界

目录 前言 一、量子计算安全的学习方向 1. 量子物理学基础 2. 量子计算原理与技术 3. 传统网络安全知识 4. 量子密码学 5. 量子计算安全政策与法规 二、量子计算的漏洞风险 1. 加密算法被破解风险 2. 区块链安全风险 3. 量子密钥分发风险 4. 量子计算系统自身风险 …

Git入门图文教程 -- 深入浅出 ( 保姆级 )

01、认识一下Git&#xff01;—简介 Git是当前最先进、最主流的分布式版本控制系统&#xff0c;免费、开源&#xff01;核心能力就是版本控制。再具体一点&#xff0c;就是面向代码文件的版本控制&#xff0c;代码的任何修改历史都会被记录管理起来&#xff0c;意味着可以恢复…

C++之异常

1.异常的概念及其使用 1.1 异常的概念 异常是一种用于处理错误的机制&#xff0c;它允许程序在检查到错误条件时&#xff0c;能够从一个代码块转到另一个代码块&#xff0c;以处理改错误&#xff0c;而不是直接崩溃返回不确定的结果。 C的异常处理机制依赖于三个关键字&#x…

Golang语言整合jwt+gin框架实现token

1.下载jwt go get -u github.com/dgrijalva/jwt-go2.新建生成token和解析token文件 2.1 新建common文件夹和jwtConfig文件夹 新建jwtconfig.go文件 2.2 jwtconfig.go文件代码 /* Time : 2021/8/2 下午3:03 Author : mrxuexi File : main Software: GoLand */ package jwtC…

河工oj(1101-1113)

1101 求组合数&#xff08;函数专题&#xff09; 代码 #include<bits/stdc.h> using namespace std;int fact(int n) {int res 1;while(n) {res * n--;}return res; } int main() {int m, k;cin >> m >> k;cout << fact(m)/fact(k)/fact(m-k) <&l…

07架构面试题

目录 一、关于合生元的面试题的架构分析的问题 1. 陈述两种方案的优劣 2. 在那些条件下&#xff0c;会选择哪一个方案 3. 你倾向那一种&#xff1f; 4. 如果要实施方案二的&#xff0c;准备步骤和流程 一、关于合生元的面试题的架构分析的问题 1. 陈述两种方案的优劣 方案…

递归:编程世界的奇妙魔法之旅

模块一&#xff1a;递归的神秘面纱 —— 初窥魔法之门 1. 递归的概念&#xff1a;神秘的魔法回响 &#x1f60e;嘿&#xff01;各位编程大侠们&#xff0c;今天咱们要来聊聊一个超级神奇的玩意儿 —— 递归。这递归啊&#xff0c;简直就是编程世界里神秘得不能再神秘的魔法回…

力扣题目总结

1.游戏玩法分析IV AC: select IFNULL(round(count(distinct(Result.player_id)) / count(distinct(Activity.player_id)), 2), 0) as fraction from (select Activity.player_id as player_idfrom (select player_id, DATE_ADD(MIN(event_date), INTERVAL 1 DAY) as second_da…

Ubuntu22.04LTS 部署前后端分离项目

一、安装mysql8.0 1. 安装mysql8.0 # 更新安装包管理工具 sudo apt-get update # 安装 mysql数据库&#xff0c;过程中的选项选择 y sudo apt-get install mysql-server # 启动mysql命令如下 &#xff08;停止mysql的命令为&#xff1a;sudo service mysql stop&#xff0…

(Linux)搭建静态网站——基于http/https协议的静态网站

简单了解nginx配置文件 1.下载并开启nginx服务 下载 [rootlocalhost ~]# dnf install nginx -y开启 [rootlocalhost ~]# systemctl restart nginx 1.(1)搭建静态网站——基于http协议的静态网站 实验1&#xff1a;搭建一个web服务器&#xff0c;访问该服务器时显示“hello w…

vue3:scss引用

原文查看&#xff1a;https://mp.weixin.qq.com/s?__bizMzg3NTAzMzAxNA&mid2247484356&idx2&sn44b127cd394e217b9e3c4eccafdc0aa9&chksmcec6fb1df9b1720b7bd0ca0b321bf8a995fc8cba233deb703512560cbe451cfb1f05cdf129f6&token1776233257&langzh_CN#rd…

Oracle - 多区间按权重取值逻辑 ,分时区-多层级-取配置方案(二)

Oracle - 多区间按权重取值逻辑 &#xff0c;分时区-多层级-取配置方案https://blog.csdn.net/shijianduan1/article/details/133386281 某业务配置表&#xff0c;按配置的时间区间及组织层级取方案&#xff0c;形成报表展示出所有部门方案的取值&#xff1b; 例如&#xff0…

13.C++内存管理2(C++ new和delete的使用和原理详解,内存泄漏问题)

⭐本篇重点&#xff1a;new, delete的使用和原理 ⭐本篇代码&#xff1a;c学习/04.c-动态内存管理 橘子真甜/c-learning-of-yzc - 码云 - 开源中国 (gitee.com) 目录 一. new和delete的使用 1.1 操作内置类型 1.2 操作自定义类型 二. new, delete与malloc, free的区别 2.1…

用源码编译虚幻引擎,并打包到安卓平台

用源码编译虚幻引擎&#xff0c;并打包到安卓平台 前往我的博客,获取更优的阅读体验 作业内容: 源码编译UE5.4构建C项目&#xff0c;简单设置打包到安卓平台 编译虚幻 5 前置内容 这里需要将 Epic 账号和 Github 账号绑定&#xff0c;然后加入 Epic 邀请的组织&#xff0c…