基于IDEA热部署更新服务器Tomcat类,服务器Tomcat热更新

前言

在开发过程中,如果我们是使用的IDEA,就会知道IDEA有一个热更新的功能,何为热更新?就是在不重启Tomcat的情况下让服务器中的代码变更为最新的。这样既能快速的更新代码,又不用担心Tomcat重启session过期的问题,如同更新jsp一般的方便,当然IDEA里面的热更新还是没有更新jsp那么方便,具体限制本文后面有提(只是我目前了解到的限制)。如果说本地更新还算快捷,那么服务器更新就更加麻烦了,一般我们更新服务器上面的程序有2种情况,一是全量更新,就是打包war包去更新,二是部分更新,就是修改了那个class,就去服务器替换某个class文件,然后重启服务器(jsp文件不算,因为更新jsp是不需要重启Tomcat的,具体原因自己行百度)。这样常规的更新有2个弊端,第一:耗费时间长,不管是文件上传的时间,还是重启服务的时间,尤其是在项目很大启动很慢的时候,有时候只是更新一个简单的东西,却要等待数分钟,而且这数分钟还不是一个人的时间,是所有当时在用这台服务器的人的时间,第二:session失效的问题,服务器一旦重启,所有登录的用户就需要重新登录(当然如果session不是保存在Tomcat中的就另当别论了)。

基于以上种种,如果更新服务器能像我们本地IDEA一样方便,那么会节省我们很多的时间,加快各方人马的开发进度。幸好这种方式是有的,可以实现在IDEA中直接更新服务器代码,此方式是基于Tomcat远程调试的(不清楚远程调试的同学建议百度,也是一个挺好用的功能),而且不需要做其他配置,所以直接进入配置环节

Tomcat远程调试配置

因为只要配置好了IDEA的远程调试,就会自动生成服务器相关的Tomcat配置,所以可以先从IDEA开始配置

IDEA配置

首先点击启动项,在弹出的界面中点击Edit Configurations…,如下图所示

Edit Configurations...

然后点击加号添加一个远程服务器

添加远程服务器

在弹出来的列表中选中Remote添加

Remote

然后在右边的界面中配置启动项的名称,服务器的地址和端口

配置地址和端口

端口需要服务器中没有被占用的端口,一旦正确配置了服务器的地址和端口,Command line arguments for remote JVM中自动生成的服务器JVM配置就是正确的了,复制好里面的内容,然后保存刚才的配置

Tomcat配置

进入Tomcat目录下bin目录修改catalina.sh文件(Linux),如果是Windows则修改catalina.bat文件,在前面加入export JAVA_OPTS=’xxx’,其中xxx是刚刚Command line arguments for remote JVM中复制的内容,然后重启服务器就可以了

使用

配置完成后,需要热更新的时候,就先从启动项中选中配置的远程服务器启动,然后修改代码,点击编译按钮,编译完成后会提示是否更新,点击确定就能更新,更新完成无论成功还是失败都会有相应的提示,跟IDEA在本地热更新是一样的,当然这样热更新也又诸多限制,代码修改限制跟IDEA本地热更新限制相同

限制

1:只能更新到方法体的修改,如果类本身添加了属性或者方法以及方法修改了参数又或者新增了类是无法更新的(IDEA本身可以通过JRebel插件热更新这些不能更新的东西)
2:想要热更新就必须要保证本地未修改前的代码跟服务器的代码是一致的,否则会导致更新不成功
3:热更新后并不会覆盖class文件,也就是说重启Tomcat后,热更新的代码就失效了,所以重启Tomcat时需要覆盖被热更新的class

Authorship: 作者
Article Link: https://raye.wang/2019/12/12/%E5%9F%BA%E4%BA%8EIDEA%E7%83%AD%E9%83%A8%E7%BD%B2%E6%9B%B4%E6%96%B0%E6%9C%8D%E5%8A%A1%E5%99%A8Tomcat%E7%B1%BB%EF%BC%8C%E6%9C%8D%E5%8A%A1%E5%99%A8Tomcat%E7%83%AD%E6%9B%B4%E6%96%B0/
Copyright: All posts on this blog are licensed under the CC BY-NC-SA 4.0 license unless otherwise stated. Please cite Raye Blog !