问题:为什么要有jfinal-undertow热部署功能(HotswapWatcher功能),设计初衷是什么?
我最近在开发时,想让修改的代码实时生效,浏览器实时可见修改内容。发现jfinal-undertow的热部署会重新加载类。导致内存状态信息丢失。session丢失(shiro-session)。我研究原码发现jfinal-undertow使用HotswapClassloader来自定义加载,并通过HotswapWatcher来监听类变更实现classloader替换,undertow重启实现热部署。
而我经常只是修改类方法内容,编译,浏览器查看变更结果。要实现这个功能,只需要debug模式运行Application.main即可实现。(前掉要去掉HotswapWatcher的启动监听代码);
概念:热加载与热部署:
热加载:在运行时重新加载class(开发环境),基于字节码的更改,不释放内存开发可用,热加载不重启tomcat,不重新打包
热部署:直接重新加载整个应用(生产环境),清空内存重新打包,重新解压war包
参考链接:
由于采用的是 class loader 方案,所以不可能做到彻底。jrebel 这类专门性的热加载第三方花了很大的规模与复杂度才做得更完善,但仍然不彻底
无法做彻底的根本原因是 java 是静态类型语言
你谈到的下面的内容:
而我经常只是修改类方法内容,编译,浏览器查看变更结果。要实现这个功能,只需要debug模式运行Application.main即可实现。
其实可以通过一个简单的配置就可以了:
undertow.devMode = false;
所以说,有没有这个功能,对于不需要的同学来说,关掉它就可以了,不影响原有习惯,也不影响习惯使用 jrebel 的同学继续使用 jrebel