1
头图

前言

我们在开发调试的过程中,经常在打包和重启服务器中消耗大量的时间,这将浪费我们大量的青春,这里介绍一款本人开发的Java远程热部署插件HotSeconds(也可以本地热部署),包括HotSecondsServer和HotSecondsClient,HotSecondsClient是IDEA插件,可以在插件市场下载,HotSecondsServer是服务端javaagent插件,主要实现对服务端的热部署,理论上来说可以热更新任何文件(java,xml,html,css,js等),也支持常用框架(Spring,MyBatis)的热更新,相对传统部署来说,效率可以提升百倍。

Java热部署的难点

相对其他脚本语言来说,Java本身并不提供完整的热部署机制,JDK1.5提供了Instrument机制热更新,但是只能支持修改方法体不能新增字段和方法,Tomcat热部署和SpringBoot-dev-tools是通过重新加载所有类实现的,更像是“热重启”,而不是热加载。况且热部署不仅仅是热加载类,远程热部署需要整合类热加载,热更新资源文件,热更新类之后刷新缓存,秒级生效,一键操作,远程热部署支持等一些列的功能。

  1. 热加载类: 包括修改代码,新增字段,新增方法,新增类,修改动态代理类等等
  2. 热更新资源文件: 比较常见的比如mybatis的xml,自定义加载的xml或者properties,当然还有各种框架的html/css/js等,只要你愿意你可以扩展任意资源文件热更新
  3. 热更新类之后刷新缓存: 比如Spring bean新增一个Autowired的字段,或者SpringMVC新增一个@RequestMapping函数,这些已经不是热加载一个类的范畴了,需要刷新缓存/上下文。
  4. 秒级生效: 做到这一点很难,很多热部署的工具只是简单的重启应用或者用classloader重新加载所有的类,这样做效率和性能都比较低。
  5. 一键化操作: 不需要敲一大堆命令,不需要太深的技术底蕴,只需要新手一键化的操作就能实现基本的热部署
  6. 远程热部署: 很多插件都是只能本地热部署,不能让本地代码一键热更新到远程,千万不要以为简单的上传文件+本地热部署就是远程热部署了,远程的环境远远要比本地复杂的多。

功能介绍

下面简单演示一下本插件的一些功能

1.热部署代码

包括修改代码,新增字段,新增方法,新增类,打破了原生JDK中Instrument机制只能修改方法体的不足。同时还支持一些常用框架的热更新,比如Spring新增一个Autowired字段或者SpringMVC新增一个Controller方法,也是支持热更新的。

springmvc1.gif

2.热部署资源文件

下面演示一个热部署MyBatis的xml文件,也是右键直接热部署生效
mybatis1.gif

3.批量热更新修改的文件

修改了多个文件的情况下,直接打开热部署面板,可将修改过的文件热部署到服务器,支持按文件修改时间戳热部署,也可以将版本控制下(Git/SVN等)未提交的文件热部署
batchhot.gif

4.执行远程函数

无需调用远程Http或者RPC接口,就能直接触发需要的函数,这对于调试来说可是非常方便的,当然也包括在沙箱环境修复脏数据。
remotemethod.png

直接在函数上右键选择远程执行函数,即可触发具体的函数逻辑,这里分为四种情况,静态,非静态,有参数,无参数。

无参数可以直接触发,如果是非静态字段,会弹出当前类的所有对象的选择框,选择后触发。

rMethodins.png

有参数的情况,会弹出对象选择框和参数输入框,输入选择后触发逻辑。
目前参数只支持byte,short,boolean,char,int,double,float,long,Bigdecimal。

复杂参数的函数,可以写一个静态无参的函数,触发需要的函数,然后远程热部署整个新写的静态无参的函数的类即可。

5.远程查看字段值

包括静态字段和非静态字段,直接在字段上右键,就能查看该字段的值。
rValue.png
非静态字段是先弹出显示当前类的所有对象实例的框,选择具体的对象后即可获取该对象的字段值。

rValue_obj.png

6.远程编译并热部署

在java文件上右键选中 Hot swap this file to remote,会在本地编译然后热更新到远程,但是有的时候本地编译并不方便,比如本地和远程服务器的JDK版本可能存在巨大的差异,这个时候就需要远程编译了。

安装教程

基于篇幅原因,先简单介绍到这,安装教程以及后期插件的更新,请详见
https://github.com/Liubsyy/HotSecondsIDEA


鹰影
1 声望1 粉丝

工程师一枚,热衷于技术