2

SpringBoot实现热部署两种方式!

 2 years ago
source link: https://segmentfault.com/a/1190000040956723
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

  小宅作为一个Java程序员,在日常的工作中,经常需要修改代码,然后重启服务,在验证代码是否生效。如果是小项目还好,重启速度比较快,等待时间比较短。但是随着项目逐渐变大,并且被拆分成多个服务时,改动一些代码,可能需要重启多个服务才能生效。这样下来就耗费了大量的时间在等待服务重启。

  这样肯定是不行的,极大的影响了我的开发效率,那么是否有方式能够实现,修改完代码之后,能够不重启项目呢?

那肯定是有的,要不然这篇文章咋来的😁。

热部署(Hot Swap)

  从Java1.4起,JVM引入了HotSwap,能够在Debug的时候更新类的字节码。所以使用热部署,可以实现修改代码后,无须重启服务就可以加载修改的代码,但是它只能用来更新方法体。作为神器的IDEA自然是支持这一技术的。

配置IDEA

  点击当前运行的服务,再点击Edit Configurations

  点击要配置的程序,找到 On ‘Update’ actionOn frame deactivation选择 Update classes and resources。点击OK就可以实现热部署了。

  经过以上配置,在修改代码以后。只需要点击小锤子或者使用快捷键Command + F9重新编译一下,就可以让改动的代码生效了。并且还会提示有多少个class被重新读取了。

   虽然到这里已经能实现热部署的功能了。但是Java的虚拟机只能实现方法体的修改热部署,对于整个类的结构修改,仍然需要重启虚拟机,对类重新加载才能完成更新操作。

方法体修改
类结构变更

  由于热部署只支持修改方法体,所以类结构变更时会报错,并提示是否需要重启。

DevTools

  前面虽然通过配置IDEA实现了简单的热部署,但是有很明显的缺点,只能实现方法体的修改热部署。很明显无法满足日常的需求的,所以这个时候就需要使用DevTools来替代了。

   DevTools是Spring为开发者提供了一个名为spring-boot-devtools的模块,来使Spring Boot应用支持热部署,提高开发者的开发效率,无需手动重启Spring Boot应用。使用起来非常简单,只需要将下面的依赖引入项目里面就可以了。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
</dependency>

   DevTools严格意义上其实不算热部署,而是快速重启。为什么这样说呢?DevTools的实现原理是:使用两个类加载器,一个是base classloader来加载不会被更改的类(例如,来自第三方的Jar),还有一个是restart classloader用来加载当前正在开发的类。所以当应用程序重新启动时,restart classloader将被丢弃,并创建一个新的类加载器。也就意味着应用程序重新启动通常比“冷启动”快得多,因为base classloader已经填充好了并且是可用的。

  简而言之就是:通过监控类路径资源,当类路径上的文件发生更改时,自动重新启动应用程序,由于只需要重新读取被修改的类,所以要比冷启动快

  那么问题来了,该如何更新类路径来触发自动重启呢?其实这个取决于你使用的 IDE:

  1. 在 Eclipse中,保存修改后的文件会导致更新类路径并触发重新启动。
  2. 在 IntelliJ IDEA中,需要点击Build按钮Command + F9构建项目来实现。

配置自动重启

  这时候可能有小伙伴想问了,难道IDEA没有类似于Eclipse中保存文件自动触发重启的功能嘛。那肯定是有的,只需要进行下面两步的配置就可以实现了。

注意:需要将前面的设置,全部还原。

  1. 开启Build project automatically

  2. 使用快捷键:Ctrl + Alt + Shift + / 调出 Registry 窗口,勾选 compiler.automake.allow.when.app.running 选项。

新版本如下图所示:

 IDEA只能实现方法体的修改热部署,无法满足日常的使用要求,所以更推荐使用DevTools。但是如果你觉得重新启动对你来说还不够快。你可以考虑使用JRebel插件。

  如果觉得对你有帮助,可以多多评论,多多点赞哦,也可以到我的主页看看,说不定有你喜欢的文章,也可以随手点个关注哦,谢谢。

  我是不一样的科技宅,每天进步一点点,体验不一样的生活。我们下期见!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK