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