1. 简介

调试是编写高质量软件时最核心的技能之一。对于 Spring 开发者来说,掌握如何高效调试 Spring 应用(尤其是 Spring Boot)至关重要。

本文将带你快速了解各种调试 Spring 应用的方法,涵盖从 JVM 启动参数、Spring Boot、传统应用服务器,到 IDE 和 Docker 环境下的调试技巧。无论你是本地开发还是远程调试,都能在这里找到实用的方案。

⚠️ 请注意:调试模式不应该在生产环境中开启,仅用于开发阶段。


2. Java 调试参数详解

Java 虚拟机默认是不开启调试支持的,因为调试会带来性能开销,并可能暴露安全风险。

要启用调试,我们需要在启动 JVM 时添加 JDWP(Java Debug Wire Protocol)参数:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000

参数说明:

参数 含义
-agentlib:jdwp 启用 JDWP 调试代理
transport=dt_socket 使用 socket 传输调试信息(也可用共享内存等)
server=y JVM 作为调试服务端,等待调试器连接
suspend=n 不暂停 JVM 启动,直到调试器连接
address=8000 监听的调试端口

✅ 这是标准配置,适用于大多数操作系统和场景。

2.1. JDK9+ 绑定地址变更

在 JDK8 及以下版本中,address=8000 表示监听所有 IP 地址(0.0.0.0),允许远程连接。

但从 JDK9 开始,出于安全考虑,默认只允许 localhost 连接。

若需要远程调试,需显式指定主机名或使用通配符:

address=*:8000
# 或
address=myhost:8000

3. Spring Boot 应用调试

Spring Boot 项目通常通过以下方式启动:

java -jar myapp.jar

要启用调试,只需添加调试参数:

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000 -jar myapp.jar

3.1. Maven 调试方式

使用 Maven 启动并开启调试:

mvn spring-boot:run -Dspring-boot.run.jvmArguments="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000"

3.2. Gradle 调试方式

首先在 build.gradle 中添加:

bootRun {
   systemProperties = System.properties
}

然后运行:

gradle bootRun -Dagentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000

4. 传统应用服务器调试

虽然 Spring Boot 已经非常流行,但在一些企业环境中,传统应用服务器仍被广泛使用。下面介绍几种常见服务器的调试方法。

4.1. Tomcat

启动脚本为 catalina.sh,开启调试只需添加 jpda

catalina.sh jpda start

默认调试端口为 8000,可通过以下环境变量修改:

  • JPDA_TRANSPORT
  • JPDA_ADDRESS
  • JPDA_SUSPEND

也可直接设置 JPDA_OPTS 来完全控制调试参数。

4.2. Wildfly

启动脚本为 standalone.sh,添加 --debug 即可:

./standalone.sh --debug

默认端口为 8787,也可以自定义:

./standalone.sh --debug 9999

更高级的控制可以通过 JAVA_OPTS 设置完整调试参数。

4.3. Weblogic

启动脚本为 startWebLogic.sh,设置环境变量:

export debugFlag=true

默认调试端口为 8453,可通过 DEBUG_PORT 修改。

更灵活的方式是使用 JAVA_OPTIONS 添加完整调试参数。

Weblogic 的 Maven 插件也支持调试,环境变量配置方式与脚本一致。

4.4. Glassfish

使用 asadmin 启动调试模式:

asadmin start-domain --debug

默认端口为 9009。

4.5. Jetty

Jetty 没有预设启动脚本,直接使用 java 命令启动,只需添加调试参数即可:

java -agentlib:jdwp=... -jar start.jar

5. IDE 调试支持

现代 IDE 都提供了强大的调试功能,包括本地启动调试和远程附加调试。

5.1. IntelliJ IDEA

IntelliJ 对 Spring 和 Spring Boot 有原生支持。调试 Spring Boot 应用非常简单:

  1. 找到包含 main 方法的类;
  2. 右键点击左侧的运行图标;
  3. 选择 Debug

如果项目有多个 Spring Boot 应用,IDEA 提供了 Run Dashboard 面板,可统一管理多个应用的调试。

intellij run gutter - icon

intellij spring run dashboard

对于 Tomcat 等服务器,可以通过 Run > Edit Configurations 添加调试配置:

intellij run debug templates

远程调试也很简单,只需配置目标主机和端口即可:

intellij remote debug configuration

5.2. Eclipse

Eclipse 中调试 Spring Boot 应用:

  1. Package ExplorerOutline 中右键点击 main 方法;
  2. 选择 Debug As > Java Application

eclipse debug java application

默认 Eclipse 不支持 Spring,但可通过 Spring Tools 插件 增强支持。

插件提供 Boot Dashboard 面板,方便管理多个应用:

eclipse spring boot dashboard

远程调试可通过 Remote Java Application 配置:

eclipse ide remote debug configuration


6. Docker 环境下调试

在 Docker 容器中调试 Spring 应用,需确保调试端口对外暴露。

暴露调试端口的方法:

  • 使用 docker run --expose 8000 myimage
  • Dockerfile 中添加 EXPOSE 8000
  • Docker Compose 中添加:
expose:
  - "8000"

⚠️ 若未使用 --network=host,则必须显式暴露调试端口。


7. 总结

本文介绍了调试 Spring 应用的多种方式,包括:

✅ JVM 调试参数
✅ Spring Boot 本地调试
✅ 传统应用服务器调试
✅ IDE 调试支持(IntelliJ / Eclipse)
✅ Docker 环境调试

无论你是本地开发、远程调试,还是容器化部署,掌握这些调试技巧,都能让你事半功倍。

踩坑提示:调试参数配置错误、端口未暴露、suspend=y 导致卡启动 是最常见的几个问题,务必留意。


原始标题:Debugging Spring Applications