IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot

1 概述

所谓热部署,对于Java来说,就是在运行时更新Java类文件。IDEA可以使用自带的Spring Boot热部署的方式进行本地/远程热部署,或者使用JRebel进行本地/远程热部署,不过需要安装JRebel and XRebel for IntelliJ这个插件。

本文将会介绍这两种方式来进行热部署,相信在看完之后,开发效率会大大提升。

2 环境

  • IntelliJ IDEA 2019.3.1
  • 本地Tomcat 9.0.30
  • JRebel and XRebel for IntelliJ 2020.2.0
  • 服务器:CentOS 8.1.1911+Tomcat:9.0.33

3 IDEA热部署

3.1 工程部分

3.1.1 新建工程

这里新建一个Spring Boot工程来进行热部署的测试。

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第1张图片

打包方式改为war,因为后面要使用外部Tomcat

勾上热部署工具Spring Boot DevTools与使用内嵌TomcatSpring Web

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第2张图片

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第3张图片

3.1.2 测试文件

新建一个响应Get请求的Controller

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第4张图片

这里添加了一个控制台信息方便查看。

3.2 内部Tomcat热部署

Spring Boot内嵌了一个Tomcat,可以直接使用其进行热部署。

3.2.1 IDEA设置

首先需要开启Compiler中的Build project automatically

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第5张图片

然后按两下shift,切换到Action,搜索Registry

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第6张图片

compiler.automake.allow.when.app.running开启:

在这里插入图片描述

最后编辑运行设置:

在这里插入图片描述

以下两项选择Update classed and resources

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第7张图片

3.2.2 测试

IDEA自带了一个HTTP client,可以发送HTTP请求,新建一个HTTP Request

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第8张图片

名字随便:

在这里插入图片描述

添加一个GET请求:

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第9张图片

修改路径与端口,注意路径对应:

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第10张图片

切换回Spring Boot的运行设置,shift+F10运行:

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第11张图片

然后就可以发送HTTP请求了,点击一下绿色的小三角:

在这里插入图片描述

返回了对应信息,控制台也有对应输出:

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第12张图片

在这里插入图片描述

然后修改Controller里面的test,改为test1

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第13张图片

不用重新运行项目,切换一下窗口让IDEA进行Update操作:

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第14张图片

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第15张图片

控制台会重新打印Spring字样,Messages中会看到Build completed successfully的信息,表示Update操作成功。

重新发送原来的HTTP请求,报错:

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第16张图片

因为此时已经没有响应localhost:8080/test的方法了,改为test1后:

在这里插入图片描述

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第17张图片

3.3 外部Tomcat热部署

由于已经配置好了IDEA的相关设置,这里就不重复了,没配置的按上面的方式配置,然后需要增加一个外部的Tomcat配置。

3.3.1 外部Tomcat配置

需要增加一个外部Tomcat的运行配置:

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第18张图片

添加Tomcat,选择local

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第19张图片

没有显示Tomcat的话在more items这里。

改个名字,Configure选择本地Tomcat的路径,同时把下面的Build去掉。

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第20张图片

部署这里要选择exploded的:

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第21张图片

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第22张图片

改回根路径:

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第23张图片

回到Server选项卡,修改以下两项为Update classed and resources

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第24张图片

3.3.2 测试

注意外部的Tomcat热部署不能使用Run运行,不能像内部的一样直接Shift+F10,要使用Debug运行,Shift+F9

在这里插入图片描述

需要确保默认的8080端口不被占用,先把刚才的Spring Boot应用暂停,在run这里,Tomcatservices这里。

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第25张图片

测试文件还是刚才的test1,发送请求:

在这里插入图片描述

然后修改test1的方法体:

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第26张图片

切换窗口后会提示class reloaded

在这里插入图片描述

再次发送刚才的HTTP请求:

在这里插入图片描述

在这里插入图片描述

成功!

不过,这种热部署只能修改方法体,如果增加了一个方法或者修改了原来的方法名等,会提示热交换失败,虚拟机不支持该操作:

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第27张图片

去万能的百度查了一下:

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第28张图片

说是Java HotSwap的限制,HotSwap是一个JVM补丁,这里就略过了。同时后面提到一些类似JRebel的第三方工具可以支持这种类型的修改,当然,下面会有详细介绍。

3.4 远程Tomcat热部署

远程Tomcat热部署比较麻烦,细节很多,一个端口错误就一堆异常,所以请耐心细看,需要三个步骤:

  • 设置服务器的Tomcat
  • 设置IDEA的服务器配置
  • 设置IDEATomcat运行配置

最后进行测试。

3.4.1 服务器的Tomcat设置

需要处理四个端口:

  • TomcatHTTP端口
  • JMX端口
  • RMI端口
  • 调试端口

其中HTTP端口就是常说的Tomcat端口,浏览器输入http://ip:port就可以访问到Tomcat的默认首页,在server.xml中设置,这里的是在69行的位置,使用默认的8080

在这里插入图片描述

Tomcatbin目录下新建一个setenv.sh

CATALINA_OPTS="-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.port=8888 
-Dcom.sun.management.jmxremote.rmi.port=8888
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false 
-Djava.rmi.server.hostname=ip
-agentlib:jdwp=transport=dt_socket,address=0.0.0.0:12345,suspend=n,server=y"

其中JMXRMI端口设为一致,只要没有占用随便取即可,address后面的12345是调试端口,根据需要设置即可。ip是服务器的地址。

-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false 

这两行表示不使用SSL连接与使用JMX客户端连接到Tomcat时不需要认证。

注意要加上

-Dcom.sun.management.jmxremote.rmi.port=8888

这个RMI端口,很多文章都没有加上这个导致部署失败。

最后修改执行权限并启动Tomcat

chmod 750 setenv.sh
./startup.sh

可以查看一下端口监听:

netstart -ano | grep -E "8080|8888|12345"

在这里插入图片描述

三个端口都监听到了,表示配置成功,若没有监听到这三个端口,请检查Tomcat日志。

同时注意防火墙与安全组的问题,如果开启了防火墙请允许这三个端口通过,安全组也要开启对应端口规则。

3.4.2 IDEA中的服务器设置

新建一个SFTP部署:

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第29张图片

IP为服务器IPportSSH端口,认证方式可以密码或者密钥,按需要选择,Root path设为Tomcatwebapps路径,如果有乱码问题把下面的高级选项的编码改为utf-8

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第30张图片

设置好了以后测试一下。

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第31张图片

映射的话,下面有完整的说明,Local path是本地的项目路径,Deployment path是相对与webapps的路径(上面设置了Root pathwebapps),Web path是相对于url的路径。

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第32张图片

3.4.3 IDEA中的Tomcat设置

新建一个Tomcat Remote

在这里插入图片描述

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第33张图片

这里是最重要的设置,设置JMX端口(这里是上面设置的8888),Host选择上一步创建的服务器,Path from root为根路径, Mapped aswebapps路径,Host下面的端口为Tomcat HTTP端口(这里使用默认的8080)。

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第34张图片

部署这里选择explodedwar包,Application context选择根路径。

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第35张图片

Debug这里修改上面设置的端口:

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第36张图片

3.4.4 测试

需要以Debug模式(Shift+F9)运行,不能直接RunShift+F10):

在这里插入图片描述

首先会提示连接到服务器和虚拟机:

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第37张图片

然后提示成功部署:

在这里插入图片描述

这时候应该会自动打开浏览器,因为这里设置了运行后打开该URL

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第38张图片

修改方法体后按Ctrl+F9,提示重新加载类:

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第39张图片

Debug信息提示已重新加载类:

在这里插入图片描述

这样就热部署成功了。

当然,像上面的使用外部Tomcat一样,如果修改方法名或者增加方法,会提示虚拟机不支持操作(解决方法是使用下面的JRebel):

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第40张图片

4 JRebel热部署

4.1 JRebel简介

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第41张图片

JRebel是一个集成了应用服务器的JVM代理,可以使用现有的类加载器重新加载类。只有修改后的类会在运行中的应用程序被重新编译和即时重新加载。

4.2 安装

从设置中的Plugins安装,搜索即可:

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第42张图片

如果速度慢的话可以从官网去下载,然后从本地安装:

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第43张图片

4.3 内部Tomcat热部署

内部Tocmat热部署非常简单,选中Spring Boot的运行配置以后,直接点击Rebel Run即可:

在这里插入图片描述

控制台提示重新加载类并且重新配置bean,表示成功。

在这里插入图片描述

当然这样做的前提是默认的Spring Boot配置已经像上面一样配置好,比如如果修改为:

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第44张图片

这样JRebel就会没有效果。

4.4 外部Tomcat热部署

像上面配置好外部Tomcat后,也是直接一键Rebel Run即可。

注意保证端口不被占用。

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第45张图片

这里与默认的热部署相比,最大的不同是允许增加与改变方法,而不仅仅是修改方法体。

下面是原来的Controller中的方法:

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第46张图片

添加一个方法后:

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第47张图片

在这里插入图片描述

提示已重新加载,表示成功,而不是提示Operation not supported by VM

4.5 远程Tomcat热部署

使用JRebel进行的远程Tomcat热部署需要先打包上传,然后才能热部署。

4.5.1 打包上传

热部署之前,需要先手动打包:

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第48张图片

上传到服务器的Tomcatwebapps下。

4.5.2 新建脚本

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第49张图片

选择运行在远程服务器或虚拟机,然后选择Tomcat

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第50张图片

按提示新建脚本:

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第51张图片

实测还需要修改脚本权限,750

在这里插入图片描述

启动之后可以看到JRebel的输出:JRebel started in remote server mode

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第52张图片

在这里插入图片描述

这样就能成功监控到变化了。

4.5.3 添加远程服务器

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第53张图片

服务器名字随便面,URLIP+端口(注意服务器的防火墙还有安全组规则开放端口),如果设置了服务器认证(通过java -jar xxx.jar -set-remote-password PASSWORD设置),则需要勾选Server authentication并填上密码。

如果Tomcat设置了访问密码(设置方法此处查看),则需要勾选HTTP Basic authentication,并填上用户名与密码:

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第54张图片

测试一下连接:

在这里插入图片描述

没问题就下一步。

4.5.4 测试

然后,打开JRebel,选择部署的项目:

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第55张图片

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第56张图片

下面是打包时的Controller方法,只有一个test

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第57张图片

测试(注意test前的路径为打包的名字,要对应):

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第58张图片

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第59张图片

然后加上test1方法,ctrl+F9,构建:

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第60张图片

服务器端提示重新加载类:

在这里插入图片描述

再次输入test1

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第61张图片

这样就远程热部署成功了!

5 附录:JAR打包

由于Spring Boot内嵌了Tomcat,可以打成JAR包的形式使用内嵌的Tomcat,这样,可以避免一系列的包括目录映射,端口等繁琐的Tomcat配置。在原来的WAR打包形式的基础上,修改pom.xml中的

在这里插入图片描述

加上maven插件(默认已加上):

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第62张图片

可以把原来的ServletInitializer删去:

在这里插入图片描述

使用Maven打包:

IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot_第63张图片

可以先在本地测试一下:

java -jar demo.jar

没问题的话就可以上传到服务器了,或者直接使用热部署,注意TomcatJRebel需要修改相应的配置,具体就不详细说了。

你可能感兴趣的:(IDEA,Tomcat,IDEA,热部署,CentOS,Spring,Boot)