我们在开发调试的过程中,经常在打包和重启服务器中消耗大量的时间,这将浪费我们大量的青春,这里介绍一款本人开发的 Java 远程热部署插件 HotSeconds ,包括 HotSecondsServer 和 HotSecondsClient ,相对传统部署来说,效率可以提升百倍。
包括修改代码,新增字段,新增方法,新增类,打破了原生 JDK 中 Instrument 机制只能修改方法体的不足。同时还支持一些常用框架的热更新,比如 Spring 新增一个 Autowired 字段或者 SpringMVC 新增一个 Controller 方法,也是支持热更新的。
在资源文件上右键也可以选择 Hot swap this file to remote ,比如 MyBatis 的 xml 文件,就能直接热更新生效,那么资源文件是怎么实现热部署的呢? 这里是根据 Path mappings 中的路径映射,将本地的资源文件热部署到远程对应目录,但是资源文件非常复杂,比如 xml ,html, css, js ,properties 等等文件,框架也非常的多,又是怎么实现热部署的呢? 路径映射只是将文件上传到服务器端,真正生效的是上传完之后刷新资源文件的缓存的逻辑,这就涉及到插件扩展,本插件内核集成了 MyBatis 和 MyBatis Plus 的 xml 的热更新,更多的资源文件热更新,详见插件扩展。
修改了多个文件的情况下,直接打开热部署面板,可将修改过的文件热部署到服务器,支持按文件修改时间戳热部署,也可以将版本控制下(Git/SVN 等)未提交的文件热部署
无需调用远程 Http 或者 RPC 接口,就能直接触发需要的函数,这对于调试来说可是非常方便的,当然也包括在沙箱环境修复脏数据。
直接在函数上右键选择远程执行函数,即可触发具体的函数逻辑,这里分为四种情况,静态,非静态,有参数,无参数。
无参数可以直接触发,如果是非静态字段,会弹出当前类的所有对象的选择框,选择后触发。
有参数的情况,会弹出对象选择框和参数输入框,输入选择后触发逻辑。
目前参数只支持 byte,short,boolean,char,int,double,float,long,BigDecimal 。
复杂参数的函数,可以写一个静态无参的函数,触发需要的函数,然后远程热部署整个新写的静态无参的函数的类即可。
包括静态字段和非静态字段,直接在字段上右键,就能查看该字段的值。 非静态字段是先弹出显示当前类的所有对象实例的框,选择具体的对象后即可获取该对象的字段值。
在打开的 jar 上面右键,可以看到两个选项,Hot deploy the Jar to remote 和 Hot swap this file to remote 。 前者是将整个 jar 的所有 class 热部署的服务器,后者只热更新选中的 class 。
在 java 文件上右键选中 Hot swap this file to remote ,会在本地编译然后热更新到远程,但是有的时候本地编译并不方便,比如本地和远程服务器的 JDK 版本可能存在巨大的差异,这个时候就需要远程编译了。
在 java 文件上右键,选择 Remote compilation and hot swap 可以在远端编译并热更新。
1
zjp 322 天前 via Android
和 DCEVM + HotswapAgent 的区别是什么
|
2
weijancc 322 天前
热部署太扯了, 谁敢用哦, 我经常使用的 Jrebel 在开发阶段热加载, 算是很成熟了, 会有几个问题, 例如修改现有的 Controller 方法, 增加一个 final 字段, 这些不重启是无法热加载, 正式生产环境不可能使用热部署, 你把这个当成 Jrebel 的替代品还有可行之处.
|
4
liubsyy OP @zjp 支持远程热更新,支持多台服务器(集群)热部署,一键化操作,支持所有的容器环境,更多的框架支持,更简单灵活的扩展,本地-远程如果端口不能直连还提供了代理服务器模式,除此之外,还增加了一些其他的功能,比如远程执行函数,远程获取字段等,形成了从开发-调试-线上修数(沙箱环境)一套完整的闭环。
|
5
dif 322 天前
用了很久的 jrebel ,因为无法白嫖,今年已经强迫自己放弃使用热部署,方便确实方便,但重启一下可以获得短暂得摸鱼时间,比如现在。
|