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 应用非常简单:
- 找到包含
main
方法的类; - 右键点击左侧的运行图标;
- 选择 Debug。
如果项目有多个 Spring Boot 应用,IDEA 提供了 Run Dashboard 面板,可统一管理多个应用的调试。
对于 Tomcat 等服务器,可以通过 Run > Edit Configurations 添加调试配置:
远程调试也很简单,只需配置目标主机和端口即可:
5.2. Eclipse
Eclipse 中调试 Spring Boot 应用:
- 在
Package Explorer
或Outline
中右键点击main
方法; - 选择 Debug As > Java Application。
默认 Eclipse 不支持 Spring,但可通过 Spring Tools 插件 增强支持。
插件提供 Boot Dashboard 面板,方便管理多个应用:
远程调试可通过 Remote Java Application 配置:
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 导致卡启动 是最常见的几个问题,务必留意。