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工程来进行热部署的测试。

在这里插入图片描述

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

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

在这里插入图片描述

在这里插入图片描述

3.1.2 测试文件

新建一个响应Get请求的Controller

在这里插入图片描述

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

3.2 内部Tomcat热部署

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

3.2.1 IDEA设置

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

最后编辑运行设置:

在这里插入图片描述

以下两项选择Update classed and resources

在这里插入图片描述

3.2.2 测试

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

在这里插入图片描述

名字随便:

在这里插入图片描述

添加一个GET请求:

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

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

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

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

3.3 外部Tomcat热部署

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

3.3.1 外部Tomcat配置

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

在这里插入图片描述

添加Tomcat,选择local

在这里插入图片描述

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

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

在这里插入图片描述

部署这里要选择exploded的:

在这里插入图片描述

在这里插入图片描述

改回根路径:

在这里插入图片描述

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

在这里插入图片描述

3.3.2 测试

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

然后修改test1的方法体:

在这里插入图片描述

切换窗口后会提示class reloaded

在这里插入图片描述

再次发送刚才的HTTP请求:

在这里插入图片描述

在这里插入图片描述

成功!

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

在这里插入图片描述

去万能的百度查了一下:

在这里插入图片描述

说是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部署:

在这里插入图片描述

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

在这里插入图片描述

设置好了以后测试一下。

在这里插入图片描述

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

在这里插入图片描述

3.4.3 IDEA中的Tomcat设置

新建一个Tomcat Remote

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

3.4.4 测试

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

在这里插入图片描述

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

在这里插入图片描述

然后提示成功部署:

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

这样就热部署成功了。

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

在这里插入图片描述

4 JRebel热部署

4.1 JRebel简介

在这里插入图片描述

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

4.2 安装

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

在这里插入图片描述

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

在这里插入图片描述

4.3 内部Tomcat热部署

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

这样JRebel就会没有效果。

4.4 外部Tomcat热部署

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

注意保证端口不被占用。

在这里插入图片描述

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

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

在这里插入图片描述

添加一个方法后:

在这里插入图片描述

在这里插入图片描述

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

4.5 远程Tomcat热部署

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

4.5.1 打包上传

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

在这里插入图片描述

上传到服务器的Tomcatwebapps下。

4.5.2 新建脚本

在这里插入图片描述

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

在这里插入图片描述

按提示新建脚本:

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

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

4.5.3 添加远程服务器

在这里插入图片描述

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

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

在这里插入图片描述

测试一下连接:

在这里插入图片描述

没问题就下一步。

4.5.4 测试

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

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

再次输入test1

在这里插入图片描述

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

5 附录:JAR打包

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

在这里插入图片描述

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

在这里插入图片描述

可以把原来的ServletInitializer删去:

在这里插入图片描述

使用Maven打包:

在这里插入图片描述

可以先在本地测试一下:

java -jar demo.jar

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

posted @ 2020-04-22 13:59  氷泠  阅读(1429)  评论(0编辑  收藏  举报