跳到主要内容基于 Remote JVM Debug 与 cpolar 实现内网 Java 程序远程调试 | 极客日志Javajava
基于 Remote JVM Debug 与 cpolar 实现内网 Java 程序远程调试
综述由AI生成通过配置 cpolar 内网穿透与 Remote JVM Debug 参数,实现在本地 IDE 对部署在内网服务器上的 Java 应用进行远程断点调试。流程涵盖环境准备、JDK 安装、cpolar 隧道配置及 IDEA 调试器设置,解决了无公网 IP 场景下的远程排查难题。该方案适用于测试环境紧急修复 bug 或跨团队协作排查分布式系统问题,但需注意远程调试的安全风险,建议仅限测试环境使用。
DevStack29 浏览 基于 Remote JVM Debug 与 cpolar 实现内网 Java 程序远程调试
Remote JVM Debug 是一款针对 Java 程序的远程调试工具,能让开发者在本地 IDE 中像操作本地程序一样,对远程服务器上的 Java 应用进行单步调试、查看变量和堆栈信息。它适用于 Java 开发工程师及需要协作排查问题的团队,其优点在于能实时诊断线上问题,无需重启服务即可修复 bug。
使用 Remote JVM Debug 时,需注意它更适合测试环境,生产环境开启可能存在安全风险。另外,本地开发环境的 JDK 版本需与远程服务器保持一致,否则可能出现调试兼容问题。
若仅在局域网内使用 Remote JVM Debug,会带来不便:开发者无法连接公司内网服务器;跨网段调试需求难以满足;客户现场问题技术支持人员不能远程接入。当 Remote JVM Debug 与 cpolar 结合后,cpolar 作为内网穿透工具,能将内网服务器的调试端口安全映射到公网,无需公网 IP 和复杂的防火墙配置,开发者随时随地都能连接远程服务器进行调试。
1. Remote JVM Debug
Remote JVM Debug(远程 JVM 调试)是一种允许开发人员通过调试工具(如 IntelliJ IDEA)连接到运行在远程服务器上的 Java 应用程序并进行调试的技术。这个过程通常涉及通过网络连接到远程 JVM 实例,并允许开发者在不直接访问物理机器的情况下查看、修改代码状态,诊断和修复问题。
2. 系统要求与环境准备
2.1 服务器环境
- 内网服务器操作系统:Windows 或 Linux。
- JDK 版本:确保服务器上安装了正确版本的 JDK,支持远程调试。
- cpolar 安装:需要在内网服务器上安装 cpolar 客户端,用于穿透远程登录、调试端口及 HTTP 请求。
2.2 本地开发环境
- IDEA:本地开发机器需要安装 IntelliJ IDEA。
- JDK:本地开发机器需要安装 JDK(版本与远程服务器相同)。
3. 内网服务器准备及开始
由于大部分项目基本部署在 Linux 服务器中,因为 Linux 的性能更优,占用更低。所以本文采用的模拟内网服务器为 Linux 的 CentOS7 系统。
3.1 安装 cpolar 配置支持远程 SSH 登录
此步骤需提前在内网服务器中操作,以支持在家远程登录公司测试环境中的内网服务器。
3.1.1 什么是 cpolar?
- cpolar 是一款内网穿透工具,可以将你在局域网内运行的服务(如本地 Web 服务器、SSH、远程桌面等)通过一条安全加密的中间隧道映射至公网,让外部设备无需配置路由器即可访问。
- 广泛支持 Windows、macOS、Linux、树莓派、群晖 NAS 等平台,并提供一键安装脚本方便部署。
3.1.2 安装 cpolar
首先,我们需要先安装 curl:
sudo yum install curl
接下来下载 cpolar,一条命令完成安装:
curl -L https://www.cpolar.com/static/downloads/install-release-cpolar.sh | sudo bash
测试 cpolar 版本以确保安装:
cpolar version
3.1.3 注册及配置 cpolar 系统服务
进入 cpolar 管理后台,点击免费注册按钮进行注册一个账号。
向系统添加及启动 cpolar 服务:
sudo systemctl enable cpolar
sudo systemctl start cpolar
sudo systemctl status cpolar
3.1.4 登录 cpolar Web UI 管理界面配置 SSH 端口穿透
3.1.4.1 放行 9200 端口
在访问 Web 页面前,需要先检查系统防火墙是否放行 9200 端口,避免访问不了。
systemctl status firewalld
有两种方式可以实现访问,一种是放行该端口,另一种是直接关闭防火墙(不建议)。
firewall-cmd --zone=public --add-port=9200/tcp --permanent
firewall-cmd --reload
firewall-cmd --zone=public --query-port=9200/tcp
3.1.4.2 访问 cpolar Web UI 管理界面
在访问之前,不确定 IP 地址可以通过 ifconfig 命令查看服务器 IP。
http://<此处应为您的 IP>:9200 # 如:http://192.168.184.133:9200
将前面步骤注册好的 cpolar 账号登录即可进入后台页面。
登录成功同时,服务器也会后台无感自动配置 token,无需手动配置 token。
配置文件位置:/usr/local/etc/cpolar/cpolar.yml
cat /usr/local/etc/cpolar/cpolar.yml
3.1.4.3 保留固定 TCP 公网地址
使用 cpolar 为其配置 TCP 地址,该地址为固定地址,不会随机变化,方便后续 SSH 远程登录。
进入官网预留页面,列表中显示了一条已保留的 TCP 地址记录:
- 地区:显示为
China Top。
- 地址:显示为
16.tcp.cpolar.top:14290。
注:地址每个账号的都不同,请以自己保留生成的为主。
3.1.4.4 启用 SSH 隧道,配置固定 TCP 地址
点击左侧菜单栏的 隧道管理,展开进入 隧道列表 页面,页面下默认会有 2 个隧道:
- ssh 隧道,指向 22 端口,tcp 协议
- website 隧道,指向 8080 端口,http 协议(http 协议默认会生成 2 个公网地址,一个是 http,另一个 https,免去配置 ssl 证书的繁琐步骤)
接着点击 ssh 隧道的编辑按钮,进入编辑页面,修改成固定 tcp 地址。
3.1.4.5 使用固定的 TCP 地址进行远程 SSH 登录
SSH 远程工具可以使用 MobaXterm、Xshell 或者 FinalShell 都可以,这里采用 FinalShell 进行远程登录演示。
接下来,双击创建的 SSH 连接,如出现提示,点击 接受并保存 即可,即可连接到内网服务器。
3.2 安装 JDK
wget https://download.oracle.com/java/17/archive/jdk-17_linux-x64_bin.rpm
sudo rpm -ivh jdk-17_linux-x64_bin.rpm
3.3 上传打包好的 Jar 文件至服务器
该项目为简单模拟测试调试使用项目,共写 3 个简单接口:
- 🟢 正常接口:
/api/normal/info:获取应用程序的基本信息,包括名称、版本、作者等
- 🔴 异常接口:
/api/bug/null-pointer:故意抛出 NullPointerException,用于调试异常处理
- 🟡 阻塞接口:
/api/bug/infinite-loop:进入无限循环,模拟线程阻塞场景
3.3.1 打包 SpringBoot 项目
Idea 中侧边栏选择 Maven 选项,然后如图操作进行构建打包 jar 文件。
3.3.2 上传至服务器
依次步骤打开找到 jar 文件 springboot-debug-test-1.0.0.jar。
将 jar 文件直接拖动至 FinalShell 空白处即可上传。
注意:一定要使用 root 用户登录,否则上传可能失败(或者确保当前用户对目标目录具有写权限)。
如果使用普通用户登录 FinalShell,可通过 chmod 或 chown 命令赋予目标目录写权限。
4. 启动 JAR 文件并配置远程调试
4.1 启动 JAR 文件
使用 java -jar 命令启动你需要调试的 JAR 文件,并开启远程调试。需要在启动命令中指定 JVM 调试参数:
java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 springboot-debug-test-1.0.0.jar
springboot-debug-test-1.0.0.jar 是要调试的 JAR 文件名称。
项目已经成功启动,端口 5005 被监听,后台该 jar 文件项目在端口 8080(http)上运行。
4.2 cpolar 隧道配置
4.2.1 HTTP(8080 端口)穿透
访问 cpolar Web UI 管理界面,进入到隧道列表,名称为 website 的隧道,点击编辑,可以看到如下信息:
- 隧道名称:website
- 协议:http
- 本地地址:8080
这些信息正是后台项目 8080 端口所需要的,所以不需要进行修改,默认创建好的隧道直接可以使用。
接着左侧菜单栏选择【状态】>【在线隧道列表】,可以看到 website 隧道有两个公网地址,http 协议(http 协议默认会生成 2 个公网地址,一个是 http,另一个 https,免去配置 ssl 证书的繁琐步骤)。
直接选择一个至浏览器测试,这里选择 http(注:每个用户的公网地址都不相同)。
由于后台项目提到的接口地址后缀为 /api/normal/info,所以正确拼接地址应为:
<您的公网地址>/api/normal/info # 如:http://5c19bf20.r1.cpolar.top/api/normal/info
4.2.2 调试端口(5005 端口)穿透
4.2.2.1 保留固定 TCP 地址
选择将 5005 端口穿透设置为固定的 tcp 地址是为了方便后续多次调试,tcp 地址不会进行变化,也可以不进行此步骤操作。
进入官网的预留页面,地区当前选择的是:China Top。
地址信息为:3.tcp.cpolar.top:12718。
记住新创建的地址信息(注意:每个用户创建的地址信息都有所不同,请注意个人的地址信息)。
4.2.2.2 创建新隧道
- 协议:
tcp
- 本地地址为:
5005
- 端口类型:
固定 tcp 端口
- 预留 tcp 地址:
填写您预留固定的 tcp 地址
5. IDEA 远程 Debug 调试内网项目
5.1 Idea 配置 Remote JVM Debug
点击启动按钮左边的选项卡,然后在选项卡中点击 Edit Configurations 进入 Run/Debug Configurations 页面。
依次点击左上角【+】号按钮,下滑选择【Remote JVM Debug】选项,点击进入。
- Name:自定义名字(如:Remote Debug)
- Host:填写固定的 tcp 地址去除端口部分(如:3.tcp.cpolar.top)
- Port:填写固定的 tcp 地址端口部分(如:12718)
5.2 启动及调试
点击右上角的小虫子图标即可启动调试,启动调试后,控制台会出现类似 Connected to the target VM, address: '3.tcp.cpolar.top:12718', transport: 'socket' 的信息,即代表启动成功。
来到 BugController 控制器,里面有一个异常接口 api/bug/null-pointer,代码如下:
@GetMapping("/null-pointer")
public String nullPointerException() {
String nullString = null;
String now = LocalDateTime.now().format(FORMATTER);
System.out.println("空指针异常接口被调用,准备抛出异常,时间:" + now);
return nullString.toString();
}
切换到浏览器,然后请求 8080 端口的穿透地址 + 异常接口地址 进行请求,如:
<您的 8080 端口穿透地址>/api/bug/null-pointer # 如:http://5c19bf20.r1.cpolar.top/api/bug/null-pointer
接着在 String nullString = null; 代码段左边打上断点调试。
再次请求一次该链接进行发送 http 请求,可以看到后端 idea 中已经进去断点调试了。
进入下一步骤,查看到 nullString 变量值确实为 null。
多跳几个步骤,进入源码后可以确认已抛出空指针异常,提示 nullString 为 null,无法调用其方法。
在 FinalShell 终端界面中也可以看到,控制台输出的日志出现了 NullPointerException 异常。
通过以上的配置,这样您就可以在家中或者外出无法及时回到公司时,也能很轻松的调试公司中内网服务器里部署的测试环境项目啦!
6. 可能出现的问题
6.1 访问页面出现 404 的情况是怎么回事?
访问出现 404。
可以发现,接口路径中少了全局上下文路径 /api,补上就可以访问啦!
7. 总结
通过本教程,我们成功实现了使用 Cpolar 结合 Remote JVM Debug 技术,在本地 IDE 环境中调试部署在公司内网中的 Java 服务。整体流程包括:
- 安装并配置 Cpolar,打通从公网访问内网的通道;
- 启用 JVM 的远程调试模式,开放调试端口;
- 使用 IntelliJ IDEA 配置 Debug 远程连接;
- 最终实现对远程服务的断点调试与问题排查。
- 公司测试环境无法直接从公网访问;
- 无法通过 VPN 连通或 VPN 配置复杂;
- 出现远程服务异常但又难以复现时,进行现场调试。
- 远程调试存在安全风险,建议仅限于测试环境,并设置好访问权限;
- cpolar 每次生成的公网地址可能会变化,建议使用固定子域名(需高级用户);
- 远程调试应避免在生产环境开启,以免暴露调试端口。
通过这种方式,极大提升了远程问题定位效率,也为远程办公/故障应急提供了可靠手段。
示例项目已在 GitHub 开源,您可以直接获取完整代码进行学习和实践:
相关免费在线工具
- Keycode 信息
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
- Escape 与 Native 编解码
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
- JavaScript / HTML 格式化
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
- JavaScript 压缩与混淆
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online