IntelliJ IDEA使用devtools实现热加载
前言
我们在开发Java应用的时候,难以避免会时常调试代码,但如果改了代码每次都要重启,那就显得非常的笨拙,并且相当的耗时。
目前大部分公司Java应用基本会以 Spring Boot
作为脚手架,本文也是介绍该官方推荐的热部署工具 Developer Tools 。
配置
首先项目中增加spring-boot-devtools配置
Maven配置
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
Gradle配置
dependencies {
developmentOnly("org.springframework.boot:spring-boot-devtools")
}
进入 Settings
(mac是Preferences 快捷键cmd + ,)
打开 Build, Execution, Deployment > Compiler
. 启用 Build project automatically
,最后点OK。
按 Ctrl+Shift+A
(Cmd+Shift+A on macOS)快捷键,然后搜索 Registry
按 Ctrl+Shift+A
(Cmd+Shift+A on macOS)快捷键,然后搜索 Registry
。打开之后找到 compiler.automake.allow.when.app.running
原理
Spring Boot提供的重启技术通过使用两个类加载器来工作。不变的类(例如,来自第三方jar的类)将被加载到基类加载器中,变动的类将加载到重新启动类加载器中。重新启动应用程序后,将丢弃重新启动类加载器,并创建一个新的类加载器。这种方法意味着应用程序的重启通常比“冷启动”要快得多,因为基本类加载器已经可用并已填充。
在保存代码的时候,只要类路径上的文件发生更改,使用的应用程序就会自动重新启动,IDE
会自动为我们编译代码,Developer Tools
检测到代码的 class 文件
(只能检测 classpath
下的 class 文件
)的变更,会自动重启项目。Spring Boot
提供的 restart 技术
提供了两个 classloaders
:base classloader
和 restart classloader
。当项目重启的时候 restart classloader
将会被抛弃,并重启创建一个,这比 code starts
(冷启动)快很多。当然,肯定是比不上 JRebel
采用的 Reload 技术
。
更多细节请参考:Automatic Restart