Java 热部署插件 HotSeconds,可实现一键化秒级热更新 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
liubsyy
V2EX    Java

Java 热部署插件 HotSeconds,可实现一键化秒级热更新

  •  1
     
  •   liubsyy 2024-01-07 23:10:39 +08:00 2849 次点击
    这是一个创建于 725 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前言

    我们在开发调试的过程中,经常在打包和重启服务器中消耗大量的时间,这将浪费我们大量的青春,这里介绍一款本人开发的 Java 远程热部署插件 HotSeconds ,包括 HotSecondsServer 和 HotSecondsClient ,相对传统部署来说,效率可以提升百倍。

    功能介绍

    1.热部署代码

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

    2.热部署资源文件

    在资源文件上右键也可以选择 Hot swap this file to remote ,比如 MyBatis 的 xml 文件,就能直接热更新生效,那么资源文件是怎么实现热部署的呢? 这里是根据 Path mappings 中的路径映射,将本地的资源文件热部署到远程对应目录,但是资源文件非常复杂,比如 xml ,html, css, js ,properties 等等文件,框架也非常的多,又是怎么实现热部署的呢? 路径映射只是将文件上传到服务器端,真正生效的是上传完之后刷新资源文件的缓存的逻辑,这就涉及到插件扩展,本插件内核集成了 MyBatis 和 MyBatis Plus 的 xml 的热更新,更多的资源文件热更新,详见插件扩展。

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

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

    4.执行远程函数

    无需调用远程 Http 或者 RPC 接口,就能直接触发需要的函数,这对于调试来说可是非常方便的,当然也包括在沙箱环境修复脏数据。
    直接在函数上右键选择远程执行函数,即可触发具体的函数逻辑,这里分为四种情况,静态,非静态,有参数,无参数。
    无参数可以直接触发,如果是非静态字段,会弹出当前类的所有对象的选择框,选择后触发。
    有参数的情况,会弹出对象选择框和参数输入框,输入选择后触发逻辑。
    目前参数只支持 byte,short,boolean,char,int,double,float,long,BigDecimal 。
    复杂参数的函数,可以写一个静态无参的函数,触发需要的函数,然后远程热部署整个新写的静态无参的函数的类即可。

    5.远程查看字段值

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

    6.jar 包热更新

    在打开的 jar 上面右键,可以看到两个选项,Hot deploy the Jar to remote 和 Hot swap this file to remote 。 前者是将整个 jar 的所有 class 热部署的服务器,后者只热更新选中的 class 。

    7.远程编译并热部署

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

    安装教程

    详见https://github.com/Liubsyy/HotSecondsIDEA

    zjp
        1
    zjp  
       2024-01-08 01:09:54 +08:00 via Android
    和 DCEVM + HotswapAgent 的区别是什么
    weijancc
        2
    weijancc  
       2024-01-08 09:20:49 +08:00
    热部署太扯了, 谁敢用哦, 我经常使用的 Jrebel 在开发阶段热加载, 算是很成熟了, 会有几个问题, 例如修改现有的 Controller 方法, 增加一个 final 字段, 这些不重启是无法热加载, 正式生产环境不可能使用热部署, 你把这个当成 Jrebel 的替代品还有可行之处.
    liubsyy
        3
    liubsyy  
    OP
       2024-01-08 10:11:23 +08:00
    @weijancc 可能是我没说太详细,我也没说用于线上热部署啊,真正的作用就是用于测试和沙箱环境,可以节省冷部署的时间提高开发效率
    liubsyy
        4
    liubsyy  
    OP
       2024-01-08 10:22:20 +08:00
    @zjp 支持远程热更新,支持多台服务器(集群)热部署,一键化操作,支持所有的容器环境,更多的框架支持,更简单灵活的扩展,本地-远程如果端口不能直连还提供了代理服务器模式,除此之外,还增加了一些其他的功能,比如远程执行函数,远程获取字段等,形成了从开发-调试-线上修数(沙箱环境)一套完整的闭环。
    dif
        5
    dif  
       2024-01-08 11:05:41 +08:00
    用了很久的 jrebel ,因为无法白嫖,今年已经强迫自己放弃使用热部署,方便确实方便,但重启一下可以获得短暂得摸鱼时间,比如现在。
    XinSong
        6
    XinSong  
       2024-01-08 11:13:53 +08:00
    @dif 白嫖还是可以的,就是如果是公司网的话,确实容易被=v=
    liubsyy
        7
    liubsyy  
    OP
       2024-01-09 10:03:17 +08:00
    @dif 哈哈,你说出了很多人不爱用热部署的真相
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2305 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 02:11 PVG 10:11 LAX 18:11 JFK 21:11
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86