前言
在 SpringBoot 开发过程中,当我们在 Debug 我们的工程时,随便修改一段代码逻辑、修改接口路由、新增一个工具类等等情况下,都需要我们重新启动工程。反复的修改逻辑,反复的重启,这是相当痛苦的过程。当工程越来越大的时候,效率将变得特别低下,大部分的时间就是在不断的重启项目、编译包、部署包。
近期在研究基于 SpringBoot + IDEA 远程调试功能,可以通过 remote-debug 方式对测试环境中的 JVM 中的代码进行调试。所谓的远程调试就是,在本地代码可以调试服务器上的代码,模拟真实环境的请求(前提是本地的代码必须和远程服务器运行的代码一致)。在这种调试环境下,只能修改少量基本的业务代码,例如新增一个函数则都无法生效。
这里强力推荐 JRebel 插件,JRebel 是一款热部署插件。当项目在 Debug 的时候,修改某一个 Java文件时,JRebel 就可以解决在项目运行状态 debug 状态下任意修改 Java文件并动态反馈到运行的项目中。JRebel 有两个非常酷的特性,(一)支持热部署,(二)支持远程热部署。
查阅大量资料,总算对配置非常清晰,决定详细整理以供备忘,也系统可以帮助小白更快的实现远程部署与远程调试!
配置环境说明
这里以我的配置环境为例,进行
- 框架:SpringBoot 2.1.6
- 工具:IntelliJ IDEA 2019.1.3 x64
- 服务器:CentOS Linux release 7.6.1810
- JDK:Java 1.8
- JRebel
- 官网:JRebel, XRebel & QRebel By ZeroTurnaround | JRebel.com
- 文档:JRebel — JRebel 2019.x documentation
一、远程调试配置
1. 右上角点击,Edit Configurations,点击 + 号,创建 Remote 应用
2. 填写远程服务器信息
- Name:应用名
- Host:服务器地址
- Port:5005
3. 复制 Command line arguments for remote JVM 下的命令
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
说明:自此,已经获得了启动远程服务的参数,命令将在启动的时候来使用
4. 启动服务
我们知道 SpringBoot 通过 Maven 打包后会生成 jar 包,服务端我们通过 jar -jar 的方式启动。通过上一步我们获得了服务端启动的配置参数命令,我们可以执行一下命令启动我的服务。
java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 webapp.jar
我们可以用如下命令进行验证是否监听成功
5. 远程调试
选择我们配置的远程调试项,点击 Debug 即可进行远程调试。
启动完成,对需要 Debug 的代码打上断点,剩下的操作步骤就是访问远程服务器对应的业务请求,本地就会同步Debug。
😎 自此,可以尽情的开始远程调试工作了!
但是在使用远程调试的过程中,如果进行了断点,会出现服务阻塞的情况。如何解决这样的问题,将在下面进行描述。
二、热部署
这里将引入 JRebel 插件,可以实现对本地的服务和远程的服务进行热部署。本节将主要针对本地热部署进行配置。
1. IDEA 中安装 Jrebel 插件
File -> Settings -> Plugins -> Search plugins in marketplace
搜索 JRebel for IntelliJ
安装即可,离线安装包下载地址:JRebel for IntelliJ - Plugins | JetBrains
安装完成后,重启 IDEA 生效。此时在 Settings 面板中会出现 JRebel 的选项卡
2. 激活 JRebel 插件
(一)官方 Active Code 方式激活(只可使用10天)
此时即可获取你的激活码,复制保存到本地,后续将会用到。
点击 help -> JRebel -> Activaction -> Activation code,将我们网页上获取到的 Activation code
粘贴后,点击 Activate JRebel
即可激活。
激活成功后在 JRebel 配置面板中,会显示 VALID 标志,即说明激活成功了。
此时,你已经获取到了试用版的 JRebel 的使用权限,即可实现本地热部署的功能,可以进行第 3 步配置。(其他激活方式请参考:Activation — JRebel 2019.x documentation,若想要永久破解,请往下阅读。)
(二)永久和谐方式
本人用户正版软件,推荐尽可能使用正版,如果想要 cracked(和谐)可以参考以下配置说明
在这里我们将通过 JRebel 的 Team URL(connect to online licensing service) 方式进行和谐(cracked)。
具体的搭建过程可以参考 Gitee 上的这位作者的仓库配置说明:JrebelLicenseServerforJava: A license server for Jrebel。当然同时,这里我也将提供一个打包完成的 jar 包,直接上传至服务器运行即可。
JrebelBrainsLicenseServerforJava-1.0-SNAPSHOT-jar-with-dependencies
# 服务启动(阻塞)java -jar JrebelBrainsLicenseServerforJava-1.0-SNAPSHOT-jar-with-dependencies.jar -port 8081# 服务启动(后台),推荐使用这种方式nohup java -jar JrebelBrainsLicenseServerforJava-1.0-SNAPSHOT-jar-with-dependencies.jar -port 8081 &
浏览器中打开链接 http://192.168.72.131:8081 ,出现如下界面则服务端配置成功。
如果是团队协作推荐搭建在一台内部都能够访问的服务器。
这里我使用的 JRebel 是 JRebel for IntelliJ v2019.1.4
版本的,我们可以通过如下 URL 进行注册
-
http://host:8081/{guid}
,其中 GUID 可以通过在线工具自己生成一个,用于区分不同的用户,而 GUID 基本上是不会出现重复的情况。生成GUID - 程序员在线工具 -
在此处,我可以通过
http://192.168.72.131:8081/bc1fdd38-9be0-4251-a619-e14a4a6c21b9
和任意一个邮箱
进行和谐(这里我们先准备好这两个参数即可)
在 file->settings->plugins->JRebel 中查看是否已显示激活,激活后显示 valid,图标为绿色。此时可以点击 Work offline 实现离线的验证,离线下有效期为半年时间,半年后可以重新认证即可。若是 online 则实时会往服务端进行匹配验证。推荐使用 Work offline 方式!
补充:这里我们主要使用自己搭建 Server 的方式进行验证,这里也提供一些网上第三方的服务平台。在网络可达的情况下,免去搭建的烦恼。
- beer_tools for jrebel
在和谐的过程中,参考的一些资料:
- JRebel永久破解激活方法 - songfei_dream的专栏
- idea离线使用jrebel(亲测可用) - lzt099的博客 - CSDN博客
- Jrebel在Idea中使用 - 鹰眼eagle-故障主动识别 - 3MS知识管理社区
- JrebelLicenseServerforJava: A license server for Jrebel & JetBrains products, it also support JRebel for Android and XRebel.
- IDEA+Jrebel实现热部署和远程调试 - ManageOne云服务保障 - 3ms知识管理社区
3. 设置 IDEA 为自动编译
4. Debug 启动服务
选择 SpringBoot 的入口类,右键选择 Debug with JRebel,等待启动完成即可
5. 本地热部署
此时可以修改或者增加代码,通过 Ctrl + Shift + F9 即可实现重新编译热部署。此时再也不需要每增加一个函数体、类都需要进行重启的操作,大大提升了 SpringBoot 开发调试的效率。
🤩 自此,我们已经学会了本地热部署的方式,需要远程调试与热部署方式进行配合调试请往下阅读。
三、远程热部署
在本节,将针对远程热部署与调试进行说明,搭建一个高效的开发测试环境。
配置远程热部署服务,主要步骤如下:
1. 配置服务器 JRebel
官方配置文档:JRebel remote server support in IntelliJ IDEA — JRebel 2019.x documentation
curl -O http://dl.zeroturnaround.com/jrebel-stable-nosetup.zip
-
由于,使用 SpringBoot 2.x,必须要下载安装最新版的 JRebel
-
也可以通过官网地址:JRebel Release Archive | JRebel.com,进行下载
jrebel
文件夹unzip jrebel-stable-nosetup.zip
jrebel
目录)java -jar jrebel.jar -set-remote-password # 例如,设置密码为 12341234java -jar jrebel.jar -set-remote-password 12341234
jrebel/bin
目录,执行脚本)在激活服务端中,JRebel 也提供了 3 种激活方式,详细地址:Activation — JRebel 2019.x documentation
在这里我们通过 With license server URL as an argument 方式,具体脚本如下
./activate.sh http://192.168.72.131:8081/bc1fdd38-9be0-4251-a619-e14a4a6c21b9 frank_lin@whu.edu.cn
With evaluation license activation code as an argument
./activate.sh
2. 配置本地 JRebel
rebel.xml
和 rebel-remote.xml
,如下图:服务器端启动服务
- 启动参数
-agentpath:[/path/to/JRebel Agent] -Drebel.remoting_plugin=true
- 热部署启动
# 远程热部署 启动java -agentpath:/root/commom/jrebel/lib/libjrebel64.so -Drebel.remoting_plugin=true -jar webapp.jar# 远程热部署+远程调试 启动java -agentpath:/root/commom/jrebel/lib/libjrebel64.so -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -Drebel.remoting_plugin=true -jar webapp.jarjava -agentpath:/var/www/jrebel/lib/libjrebel64.so -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -Drebel.remoting_plugin=true -jar webapp.jar -port 8083
详细官网配置说明:Server configuration — JRebel 2019.x documentation
启动日志如下,即说明启动成功
Listening for transport dt_socket at address: 5005
说明启动了远程调试JRebel started in remote server mode.
说明启动了远程热部署
Listening for transport dt_socket at address: 50052019-07-16 09:15:20 JRebel: Starting logging to file: /root/.jrebel/jrebel.log2019-07-16 09:15:20 JRebel:2019-07-16 09:15:20 JRebel: #############################################################2019-07-16 09:15:20 JRebel:2019-07-16 09:15:20 JRebel: JRebel Agent 2019.1.4 (201907051008)2019-07-16 09:15:20 JRebel: (c) Copyright 2007-2019 Rogue Wave Software, Inc.2019-07-16 09:15:20 JRebel:2019-07-16 09:15:20 JRebel: Over the last 1 days JRebel prevented2019-07-16 09:15:20 JRebel: at least 0 redeploys/restarts saving you about 0 hours.2019-07-16 09:15:20 JRebel:2019-07-16 09:15:20 JRebel: JRebel started in remote server mode.2019-07-16 09:15:20 JRebel:2019-07-16 09:15:20 JRebel:2019-07-16 09:15:20 JRebel: #############################################################
可以先远程热部署后,再点击远程调试 Debug,即可实现先热部署再调试,大大加快开发效率。
😄 自此,所有的配置过程都结束了!即可开始尽情享受,JRebel 远程热部署和远程调试~ 实现真正的热部署,无论是改了代码片段还是配置文件,都可以做到不用重新启动就生效!
TODO
文档还有很多不足的地方,这是接下来会更新的部分
- 基于 Docker 远程调试与部署
- 远程调试,服务阻塞怎么办
参考资料
- Intellij IDEA基于Springboot的远程调试 - 程序新视界 - CSDN博客
- IDEA + Spring Boot + JRebel 热部署不能自动编译的解决方案和启动的几种方式 - github.com/duanluan - CSDN博客
- IntelliJ IDEA热部署插件JRebel免费激活图文教程(持续更新)_心得技巧_积微成著
- JRebel遠端熱部署springboot教程 - IT閱讀
- 微服务开发神器–JRebel 插件破解和实现本地/远程热部署教程(IntelliJ IDEA版) - 掘金
- JRebel远程热部署springboot教程 - whz的博客 - CSDN博客