V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
liubsyy
V2EX  ›  Java

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

  •  1
     
  •   liubsyy · 321 天前 · 1928 次点击
    这是一个创建于 321 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前言

    我们在开发调试的过程中,经常在打包和重启服务器中消耗大量的时间,这将浪费我们大量的青春,这里介绍一款本人开发的 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  
       321 天前 via Android
    和 DCEVM + HotswapAgent 的区别是什么
    weijancc
        2
    weijancc  
       320 天前
    热部署太扯了, 谁敢用哦, 我经常使用的 Jrebel 在开发阶段热加载, 算是很成熟了, 会有几个问题, 例如修改现有的 Controller 方法, 增加一个 final 字段, 这些不重启是无法热加载, 正式生产环境不可能使用热部署, 你把这个当成 Jrebel 的替代品还有可行之处.
    liubsyy
        3
    liubsyy  
    OP
       320 天前
    @weijancc 可能是我没说太详细,我也没说用于线上热部署啊,真正的作用就是用于测试和沙箱环境,可以节省冷部署的时间提高开发效率
    liubsyy
        4
    liubsyy  
    OP
       320 天前
    @zjp 支持远程热更新,支持多台服务器(集群)热部署,一键化操作,支持所有的容器环境,更多的框架支持,更简单灵活的扩展,本地-远程如果端口不能直连还提供了代理服务器模式,除此之外,还增加了一些其他的功能,比如远程执行函数,远程获取字段等,形成了从开发-调试-线上修数(沙箱环境)一套完整的闭环。
    dif
        5
    dif  
       320 天前
    用了很久的 jrebel ,因为无法白嫖,今年已经强迫自己放弃使用热部署,方便确实方便,但重启一下可以获得短暂得摸鱼时间,比如现在。
    XinSong
        6
    XinSong  
       320 天前
    @dif 白嫖还是可以的,就是如果是公司网的话,确实容易被=v=
    liubsyy
        7
    liubsyy  
    OP
       319 天前
    @dif 哈哈,你说出了很多人不爱用热部署的真相
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1172 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 18:34 · PVG 02:34 · LAX 10:34 · JFK 13:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.