【保姆级】IDEA SpringBoot热部署及遇到的坑

前言

作为一个小白,在开始做SpringBoot项目时,每次手动修改一点点地方都需要手动重启,真是又费时又费力。于是开始研究SpringBoot的热部署,中间遇到些问题,自己研究了很久大概明白了一些(百度下来全都是千篇一律,也真是不想吐槽了),有不正确的地方欢迎指正。

概念(遇到的坑)

在进入教程前,我觉得有必要先了解一些概念的东西,不然会让我们对后面的热部署产生误解(别说了,我就是)

触发机制

可能很多人像我一样,配置的时候度娘基本都是热部署XXX自动更新之内的字眼,让我们误以为热部署配置完成后就全自动的部署。
经过我多次的测试,热部署触发是在文件保存之后。

IDEA自动保存不会触发热部署?

在IDEA配置完SpringBoot热部署之后,为什么不会自动触发?或者时而触发,时而不触发?
那是因为IDEA的默认配置中,保存操作是在从IDEA切换到其他应用时保存。
如果想更频繁的保存,可以勾选第三项,并设置一个时间。eg:当应用程序空闲1秒后保存文件。
在这里插入图片描述

热部署与热加载

热部署与热加载都可以实现不重启服务器编译、部署项目,但他们的区别如下:

  • 热部署:在运行时重新部署项目,重新加载整个应用
  • 热加载:在运行时重新加载Class

如果你在此之前已经百度过其他的教程,你对下面这幅图一定不会陌生。
在这里插入图片描述
没错,这里是项目启动时配置的地方。图中框出的就是配置热加载(HotSwap)的地方。我个人认为,配置这里对自动热部署没有直接关系,热部署配置这里属于无用的配置。

  • On ‘Update’ action:手动点击Update之后触发
  • On frame deactivation:从IDEA切换到其他应用时触发

疑问:既然热加载也可以实现重新的加载,为什么我们还要配置热部署?
回答:

  1. 热加载只加载Class,不能保证环境一致。
  2. IDEA热加载(HotSwap)目前只支持对方法body的修改,不支持对类和方法签名的修改(比如改类名、方法名、方法参数等)
    官方也曾答疑过这个问题,跳转链接在这里插入图片描述

实战测试热加载:

  1. 配置
    在这里插入图片描述
  2. 修改方法内容
    在这里插入图片描述
  3. 修改方法
    在这里插入图片描述
  4. 目前还知道修改请求路径这些也是无法热加载的

热部署配置

前提:开启自动编译

要自动热部署,不仅要保存触发操作,还需要我们编译好文件。为了省事,配置一下IDEA的自动编译。

  1. File -> settings -> Build,Execution,Deplyment -> compiler
    仅在不运行/调试时自动编译
    在这里插入图片描述
  2. option + command + shift + / (MAC) 或者 ctrl + alt + shift + / (WIN)打开Maintenance,选择Registry…
    搜索并找到app.running这一项,勾选表示程序运行时自动编译
    在这里插入图片描述

SpringLoaded方式实现热部署

不会重启整个项目,但需要配置启动参数、下载Jar包

  1. 可以在Maven仓库或者其他地方下载Jar包
    在这里插入图片描述
  2. IDEA中配置启动参数
-javaagent:/Users/doubly/Desktop/springloaded-1.2.8.RELEASE.jar -noverify

在这里插入图片描述

图中红框是Jar包的路径,我这里取得是绝对路径。
本来其实是想Maven中加这个依赖,就不需要下载Jar包了,但是不知道这里的路径应该怎么填写,有大神知道的可以指导小弟一下

  1. Debug启动,修改后可以自动热部署

在这里插入图片描述

图中这个提示就是热部署时打印出来的,但这个警告我不知道是什么,没有去查

Springboot-devtools方式实现热部署

实现简单,但整个项目全部重启,不过比手动重启快

  1. 添加依赖
    在这里插入图片描述
  2. Debug启动,实现热部署
    在这里插入图片描述

其他

因为没有亲自使用过,就不多赘述了

  1. springloaded与mvn spring-boot:run方式
  2. IDEA插件,Jrebel
  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
单链表是一种常见的数据结构,用于存储一系列的节点连接起来的数据。 在C语言中,我们可以使用结构体来定义一个节点,包含一个数据域和一个指向下一个节点的指针域。代码如下: ```c struct Node { int data; struct Node* next; }; ``` 然后,我们可以定义一个指向链表头部的指针,表示整个链表的起始位置。初始化链表时,这个指针可以指向NULL。 ```c struct Node* head = NULL; ``` 接下来,我们可以实现一些基本的操作,例如插入节点、删除节点、遍历链表等。 插入节点的过程包括创建一个新节点,并将其插入到链表中适当的位置。 ```c void insertNode(int value) { struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); newNode->data = value; newNode->next = NULL; if (head == NULL) { head = newNode; } else { struct Node* curr = head; while (curr->next != NULL) { curr = curr->next; } curr->next = newNode; } } ``` 删除节点的过程需要找到目标节点,并调整前后节点的指针。 ```c void deleteNode(int value) { if (head == NULL) { return; } if (head->data == value) { struct Node* temp = head; head = head->next; free(temp); return; } struct Node* prev = head; struct Node* curr = head->next; while (curr != NULL && curr->data != value) { prev = curr; curr = curr->next; } if (curr != NULL) { prev->next = curr->next; free(curr); } } ``` 遍历链表的过程是从头节点开始,依次打印每个节点的数据。 ```c void printList() { struct Node* curr = head; while (curr != NULL) { printf("%d ", curr->data); curr = curr->next; } printf("\n"); } ``` 这是一个简单的单链表的实现示例,你可以根据需要进一步扩展和优化。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值