之前一直在用热部署,但没有总结,网上有很多类似文章,我这里用最简洁的描述总结一下,开发工具是IDEA。
一、热部署
热部署是指对程序进行(修改)升级后,不需要重新启动应用,能够试程序升级生效。
为什么要用热部署?
每次程序升级,都需要手动重启程序,操作繁琐并且耗时较长。
热部署的优点?
重启快,不用手动干预。具体原因会在实现原理中说明。
二、IDEA中实现springboot热部署
1、pom文件依赖
- pom文件添加spring-boot-devtools依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
- 添加spring-boot-maven-plugin插件
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.5.7.RELEASE</version>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
2、project配置文件修改
application.properties文件中添加下面代码
spring.devtools.restart.enabled=true
或者,
application.yaml文件中添加下面代码
spring:
devtools:
restart:
enabled: true
3、IDEA配置修改
- 打开自动编译选项
Preferences --> Build,Execution,Deployment --> Compiler --> Build project automatically,勾选。
- Registry配置修改
打开Registry配置界面。
windows快捷键:ctrl + shift + alt + /
mac快捷键:alt + command + shift + /
勾选compiler.automake.allow.when.app.running后关闭即可。
三、测试验证
新建一个controller类,保存
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author dingws
* @PackageName cece_content_service_admin
* @Package com.content.admin.contentservice.controller
* @Date 2021/4/27 1:54 下午
* @Version 1.0
*/
@RestController
@RequestMapping("/test")
public class testAutoController {
@RequestMapping("/testA")
public String getTestA(){
return "function getTestA";
}
}
在浏览器输入路由后,能正常访问。
- 代码修改- –>保存:应用会重启
- 修改配置文件–->保存:应用会重启
- 修改页面–->保存:应用不会重启,但会重新加载,页面会刷新
四、实现原理
首先我们说一下JVM的工作原理:
JVM每次启动后,需要申请内存空间,然后会把项目下所有的*.class文件通过类加载器load进内存,然后建立栈区和代码区的映射,关闭时会进行释放和清理,整个过程比较耗时。
深入了解可参考《JVM类加载器机制与类加载过程》。
热部署的原理可以概括为在启动的时候起一条后台线程,定时的检测类文件的时间戳变化,如果类的时间戳变掉了,则将类重新载入。
假设项目一共有1000个类,手动重启需要加载1000个类,而热启动只会把新修改的文件重新load进去就行,而且省去了JVM自身初始化的时间,所以效率比较高。