Java代码热更新工具

Java代码能否像其他动态语言一样修改完立刻生效?屏幕前的你还在为修改代码之后测试环境重新部署很慢而烦恼吗?本文介绍的Java代码热更新工具将帮你解决这个烦恼,节省下宝贵的时间,学习技术提升自己,早点下班陪陪家人。

在平时的开发过程中,开发流程一般是,编写/修改代码 -> 编译/打包 -> 部署/重启服务 -> 测试刚才的代码 -> 编写/修改代码 -> 编译/打包...这样的一个循环。

常见问题场景

下面的场景是否很熟悉呢?

小明: 小张,我这个接口开发完了,在测试环境部署好了,你调用下吧。
小张: 好。小明,这个请求结果不对,bla bla bla
小明: 不应该呀,我查一查。哎呀看不出来,要是这里有日志就好了,我加个日志重新部署下吧。小明开始修改代码,本地打包4分钟,上传测试机1分钟,测试机服务重新启动5分钟。
小明: 哎呀,原来是这里判断写反了,我修改下重新部署下。十分钟过去了... 哎呀,这里少加一个调用,我修改下。又十分钟过去了...
转眼晚上11点多了,小张已经等的不耐烦提前下班了。
小明: 要是能修改完代码在测试环境立马生效就好了,今天就能早点下班了

Java热更新工具

Java代码热更新工具正是为了解决这种痛点开发的,修改完代码,通过IDEA插件更新到测试环境直接生效。

整个过程流畅快捷,帮助你节省时间、节省精力,留出时间做更重要的事情。

修改后能够立即生效看到结果,这种实时反馈的价值也是巨大的,能够实现所见即所得,What you see is what you get。

使用方式

代码热更新工具支持远程模式和本地两种模式,下面先以远程模式举例。

  1. 目标测试机部署agent
    一个机器只需安装一次agent,在测试机中运行如下命令即可。
wget https://maven.aliyun.com/repository/public/com/github/liuzhengyang/hotreload-boot/1.0.5/hotreload-boot-1.0.5-jar-with-dependencies.jar

java -jar hotreload-boot-1.0.5-jar-with-dependencies.jar -localMode

image.png
安装IDEA插件

点击IDEA页面左上角IntelliJ IDEA -> Preferences -> Plugins,搜索hotfix,安装即可。

image.png
IDEA插件配置

点击IDEA页面左上角IntelliJ IDEA -> Preferences -> Tools -> HotReloadConfig
Server中填写 localhost:18806 我这里是本地安装,如果是远程安装,则填写对应的ip:port,或者nginx代理域名

HostName选择自己的测试机
keyword 填写自己Java进程的唯一标识,用于筛选自己的java进程,可以用启动参数或进程id来筛选,例如tomcat服务一般都有一个唯一的端口号可以用端口号筛选,rpc等服务也都是可以的。
填写完后,Process会展示筛选后的进程,可以再确认一次。
完成后,点击Apply OK保存。

image.png

修改完代码后,在编辑器中右键 -> Hot Reload,或者使用快捷键Cmd + Shift + L,便可以立即热更新了。

自动注册模式

如果测试机较多,并且不能直连测试机的话,给每个测试机配置nginx是一个比较麻烦的事情,所以HotReload工具也支持代理注册模式。

首先找一个机器启动一个集中的使用eureka的注册中心。

wget https://maven.aliyun.com/repository/public/com/github/liuzhengyang/hotreload-registry/1.0.5/hotreload-registry-1.0.5.jar
java -jar hotreload-registry-1.0.5.jar

然后启动hotreload-boot的时候,增加参数 –eurekaServer xxx:8761,xxx是启动eureka那个机器的ip或hostname

image.png

端口冲突怎么办?

可以通过 –port 指定port,例如 –port 18809

实现原理简介

项目源码在 https://github.com/liuzhengyang/lets-hotfix ,欢迎大家给这位大佬star支持。

整个项目分为三个部分,idea插件,测试机上的hotreload-web,和一个hotreload-agent。

idea插件负责编译修改完的代码,把修改后的class上传给测试的hotreload-web,然后hotreload-web会动态链接到你的目标Java进程。

动态链接使用的是java attach模块的功能,链接的同时会加载hotreload-agent。

链接上之后,hotreload-agent启动可以获得一个Instrumentation对象,通过Instrumentation对象的retransformClasses 便可以实现类的重定义,也就是热更新了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。