温馨提示×

Java在Debian上的远程调试怎么做

小樊
43
2026-01-01 15:59:07
栏目: 编程语言

在 Debian 上进行 Java 远程调试的标准做法


一 准备环境

  • 安装 OpenJDK(示例为 OpenJDK 17):
    • 更新索引并安装:sudo apt update && sudo apt install openjdk-17-jdk
    • 验证版本:java -version
    • 可选设置环境变量(便于其他工具使用):编辑 /etc/environment,加入 JAVA_HOME="/usr/lib/jvm/java-17-openjdk-amd64",执行 source /etc/environment 生效。

二 启用远程调试的两种方式

  • 方式 A 普通 Java 应用(命令行启动)
    • 在启动命令中加入 JDWP 代理参数,示例:
      • java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar your_app.jar
      • 关键参数说明:
        • transport=dt_socket:使用 Socket 传输
        • server=y:当前 JVM 作为调试服务器
        • suspend=n:启动不暂停;如需等调试器连上再启动,改为 y
        • address=5005:监听端口(可自定义,如 80009000
    • 旧版兼容写法(Java 5 之前常用):
      • java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 -jar your_app.jar
  • 方式 B Tomcat 等容器
    • 编辑 /etc/default/tomcat9,在 JAVA_OPTS 中追加 JDWP 参数:
      • JAVA_OPTS="${JAVA_OPTS} -agentlib:jdwp=transport=dt_socket,address=0.0.0.0:8000,server=y,suspend=n"
    • 重启 Tomcat:sudo systemctl restart tomcat9
    • 说明:将监听地址设为 0.0.0.0 允许来自外部的调试连接;端口如 8000 可按需修改。

三 开放防火墙与安全组端口

  • UFW(Debian 常见):sudo ufw allow 5005/tcp
  • firewalld:sudo firewall-cmd --zone=public --add-port=5005/tcp --permanent && sudo firewall-cmd --reload
  • 云服务器:在云平台安全组放行对应 TCP 端口(如 5005)。

四 在 IDE 中连接远程调试

  • IntelliJ IDEA
    • Run → Edit Configurations → 新建 Remote JVM Debug
    • 配置 Host(服务器 IP)与 Port(如 5005),Transport 选择 Socket,Mode 选择 Attach
    • 启动调试,控制台出现 “Connected to the target VM …” 即连接成功
  • Eclipse
    • Run → Debug Configurations → 新建 Remote Java Application
    • 填写项目、Host、Port,点击 Debug 开始远程调试。

五 Docker 与 Kubernetes 场景

  • Docker
    • 运行时映射调试端口并传入 JDWP 参数:
      • docker run -p 8080:8080 -p 5005:5005 my-java-app java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar /app.jar
  • Kubernetes
    • Deployment 的容器 ports 增加调试端口(如 5005),并在容器 args 中追加相同的 JDWP 参数;Service 可选择是否暴露调试端口(通常仅内网可达)。

六 常见问题与注意事项

  • 端口占用与连通性
    • 检查监听:ss -ltnp | grep 5005netstat -tlpn | grep 5005
    • 云环境需同时放行安全组与系统防火墙
  • 版本匹配与断点有效性
    • 本地源码版本需与服务器运行的 class/jar 一致,否则断点可能不生效
  • 性能与安全
    • 远程调试会带来一定性能开销;调试完成后应移除调试参数并重启服务,避免长期暴露调试端口
  • 旧参数兼容性
    • 新版本优先使用 -agentlib:jdwp;仅在老版本需要时再用 -Xdebug -Xrunjdwp

0