JRebel实现远程docker容器部署的jar包热部署

689 阅读3分钟

有关通过docker容器启动jar包,可以看通过docker容器启动jar包详解。当然,本文也会针对非docker容器的情况给出基本方案。

1 缘起与目的

近期,笔者在项目上需要调一个其他服务的短信接口,该接口对调用url的出口ip与端口号做了限制,即只能通过指定ip与端口号进行调用,这对开发者的测试造成了麻烦。对此,笔者研究学习了网上的IDEA插件JRebel远程热部署的方式,在docker容器部署的jar包的基础上实现了热部署,文章基于此记录。需要明确的是,这样在生产环境直接部署代码并不安全,笔者也是在非主服务进行测试的,使用此方式须确保代码安全。

2 非docker容器实现远程JRebel热部署

首先我们使用非容器的方式来测试JRebel热部署的可行性。

2.1 服务器文件上传

需上传JRebel插件的 lib文件夹与jar包 到服务器

不同用户jrebel.jar包存储位置不同,笔者位置为

C:\Users\用户名\AppData\Roaming\JetBrains\IntelliJIdea2021.2\plugins\jr-ide-idea\lib\jrebel6

image.png

将lib文件夹与jrebel.jar到服务器

image.png

2.2 IDEA配置

重要的话说在前面:一定要先开启jrebel远程热部署配置,生成对应的xml,重新打成jar包,才能实现热部署!jar包里没有jrebel的rebel-remote.xml是不能实现远程热部署的!

  1. 开启热部署配置

找到jrebel窗口,给云图标列下需要热部署的模块打包,发现每个模块resource下出现对应rebel-remote.xml配置文件。

image.png

image.png

  1. 重新打jar包上传并启动jar包
java "-agentpath:jrebel所在地址/lib/libjrebel64.so" -Drebel.remoting_plugin=true -jar 上传的应用jar包.jar

启动发现开始启动的页面出现jrebel相关信息。

image.png

  1. 配置远程主机

启动完成后配置IDEA远程服务器。

文件-设置-JRebel & XRebel-添加url

image.png

url为http://服务器ip:应用端口

配置完成后须确保该条远程主机为选中状态

2.3 测试

修改代码,然后重新构建项目,或者点如下标识:

image.png

发现服务器日志出现如下提示:

image.png

热部署成功!

3 docker容器的JRebel热部署

3.1 Dockerfile文件构建

通过docker容器启动jar包详解基础上,我们重新改一下Dockerfile,改后如下。

FROM java:8
MAINTAINER  roc
# 把docker的logs的调整到和服务器时间相同
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo ‘Asia/Shanghai’ >/etc/timezone
ENV MYPATH /usr/local
ENV properties ""
WORKDIR $MYPATH
# 给jar包赋予权限(可以不用)
CMD chmod 777 /usr/local/app/*.jar
# 用tee命令将产生的目录在输出到控制台的同时输出到文件中
# 加上jrebel热部署相关内容
CMD java "-agentpath:/usr/local/app/JRebel/lib/libjrebel64.so" -Drebel.remoting_plugin=true -jar /usr/local/app/*.jar $properties | tee /usr/local/app/log.file

3.2 docker容器启动

jar包里面还是必须有用于热部署定位的rebel-remote.xml配置文件。

docker run -p 8888:8888 -v /mnt/data/jrebel-app/:/usr/local/app/ -e properties="-set-remote-password pmjrebelapp" --name pm-jrebel-app pm-jrebel-jdk

我的文件结构为

/mnt/data/jrebel-app/JRebel/lib

/mnt/data/jrebel-app/JRebel/jrebel.jar

/mnt/data/jrebel-app/XX.jar

当然,你也可以不根据我的规则来映射,只要能保证启动时能访问到对应jar包和lib文件即可。

这里加了密码,如果要去掉密码,则去掉-e对应参数即可。

idea配置密码位置如下:

image.png

启动后测试发现没啥问题,docker容器部署的jar包热部署完成。