前言

我们在开发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 + ,)

image-20200929111909612

打开 Build, Execution, Deployment > Compiler. 启用 Build project automatically,最后点OK。

image-20200929112119693

Ctrl+Shift+A (Cmd+Shift+A on macOS)快捷键,然后搜索 Registry

image-20200929111801572

Ctrl+Shift+A (Cmd+Shift+A on macOS)快捷键,然后搜索 Registry。打开之后找到 compiler.automake.allow.when.app.running

image-20200929111645731

原理

4236553-dbe5357dffc7d83b

Spring Boot提供的重启技术通过使用两个类加载器来工作。不变的类(例如,来自第三方jar的类)将被加载到基类加载器中,变动的类将加载到重新启动类加载器中。重新启动应用程序后,将丢弃重新启动类加载器,并创建一个新的类加载器。这种方法意味着应用程序的重启通常比“冷启动”要快得多,因为基本类加载器已经可用并已填充。

在保存代码的时候,只要类路径上的文件发生更改,使用的应用程序就会自动重新启动,IDE 会自动为我们编译代码,Developer Tools 检测到代码的 class 文件(只能检测 classpath 下的 class 文件)的变更,会自动重启项目。Spring Boot 提供的 restart 技术提供了两个 classloadersbase classloaderrestart classloader。当项目重启的时候 restart classloader 将会被抛弃,并重启创建一个,这比 code starts(冷启动)快很多。当然,肯定是比不上 JRebel 采用的 Reload 技术

更多细节请参考:Automatic Restart