关于jfinal-undowter热部署的设计初衷?

问题:为什么要有jfinal-undertow热部署功能(HotswapWatcher功能),设计初衷是什么?

我最近在开发时,想让修改的代码实时生效,浏览器实时可见修改内容。发现jfinal-undertow的热部署会重新加载类。导致内存状态信息丢失。session丢失(shiro-session)。我研究原码发现jfinal-undertow使用HotswapClassloader来自定义加载,并通过HotswapWatcher来监听类变更实现classloader替换,undertow重启实现热部署。

而我经常只是修改类方法内容,编译,浏览器查看变更结果。要实现这个功能,只需要debug模式运行Application.main即可实现。(前掉要去掉HotswapWatcher的启动监听代码);


概念:热加载与热部署:

  1. 热加载:在运行时重新加载class(开发环境),基于字节码的更改,不释放内存开发可用,热加载不重启tomcat,不重新打包

  2. 热部署:直接重新加载整个应用(生产环境),清空内存重新打包,重新解压war包


参考链接:

1.关于jvm热加载技术记录

评论区

JFinal

2020-12-24 12:21

初衷是为了开发体验的流畅,新增类、方法等动作不用去手动重启服务

由于采用的是 class loader 方案,所以不可能做到彻底。jrebel 这类专门性的热加载第三方花了很大的规模与复杂度才做得更完善,但仍然不彻底

无法做彻底的根本原因是 java 是静态类型语言


你谈到的下面的内容:
而我经常只是修改类方法内容,编译,浏览器查看变更结果。要实现这个功能,只需要debug模式运行Application.main即可实现。

其实可以通过一个简单的配置就可以了:
undertow.devMode = false;

所以说,有没有这个功能,对于不需要的同学来说,关掉它就可以了,不影响原有习惯,也不影响习惯使用 jrebel 的同学继续使用 jrebel

JFinal

2020-12-24 12:22

至于 Java 的热部署,阿里这类大厂在很多年前就尝试过,最后失败了

_imlzw_

2020-12-24 12:34

@JFinal 原来是这样的啊,开发时如果能热部署的话,还是挺不错的。不过我最新开发发现由于shiro session的问题影响我的开发效率,所以,我就研究了一番。
那如果deMode = false会不会影响到其它功能开发体验呢?(会不会影响其它功能的开发,缓存 的更新?),即:有需要给热部署独立设置一个开关吗(在热部署还未成熟时)?

JFinal

2020-12-24 14:52

@_imlzw_ undertow.devMode = false; 不影响其它功能的开发体验,不支持热部署

_imlzw_

2020-12-24 15:58

@JFinal 刚搜索了试用了下你说到的jrebel,发现其是热加载技术,支持类的添加,方法添加等操作而不会丢失内存对象状态。已经在我的idea intellij是安装并初步使用,开发体验优于idea的默认debug模式(主要优化debug不支持的类添加,方法添加等等热加载操作)。真不错。

JFinal

2020-12-24 16:06

@_imlzw_ jrebel 这东西出来很多年了,热加载用得最多的就是它了,开发用着是不错的,但是这东东是收费的商业项目

_imlzw_

2020-12-25 16:22

@JFinal jrebel这么牛,想了解除原理 网络上找了一遍,没搞明白,倒是搜索到阿里的HotCode相关资料,可惜网络没有找到可用程序。

HotCode资料:https://www.open-open.com/ppt/54489ff66016406d8c06292637e59910.html

JFinal

2020-12-25 17:00

@_imlzw_ 做热部署要深入 JVM 的原理,需要花时间研究