如何跨机器远程调试由Gradle执行的JUnit测试?
跨机器远程调试Gradle执行的JUnit测试解决方案
我之前也碰到过一模一样的问题——本地用--debug-jvm调试Gradle测试完全正常,但跨机器就一直报「Connection refused」,折腾了好一阵才搞明白:Gradle默认的调试参数只会绑定本机localhost,外部机器根本连不上。结合你用的Gradle 5.6.2 + JDK 11环境,给你两个靠谱的解决办法:
方案一:命令行直接指定测试JVM的调试参数
放弃用--debug-jvm,直接给测试任务的JVM传入完整的调试参数,强制绑定到所有网卡:
./gradlew :<directory> --tests <ClassName> --info -Dorg.gradle.jvmargs="-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005"
这里的address=*:5005是关键——它让测试JVM在5005端口监听所有网卡的连接请求,机器B就能正常连上了。
方案二:在build.gradle中配置持久化的调试参数
如果不想每次都敲长命令,可以在对应模块的build.gradle里给test任务加固定配置:
test { // 直接启用远程调试,绑定所有网卡的5005端口 jvmArgs '-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005' // 进阶玩法:通过系统属性开关调试(避免平时跑测试也挂起) // if (System.getProperty('enableRemoteDebug') == 'true') { // jvmArgs '-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005' // } }
配置完后,直接执行测试命令即可:
./gradlew :<directory> --tests <ClassName> --info
如果用了开关模式,就加个系统属性触发:
./gradlew :<directory> --tests <ClassName> --info -DenableRemoteDebug=true
为什么你之前的方法没生效?
- 用
debugOptions配置时,Gradle 5.x版本的默认address还是绑定localhost,并没有对外暴露端口,所以机器B连不上; - 修改
org.gradle.jvmargs是给Gradle守护进程加的参数,不是给测试运行的独立JVM加的,所以测试线程根本不会挂起等待调试连接。
额外必查项
别忘检查机器A的防火墙!如果对应的端口(比如5005)没开放,哪怕参数配对了还是会报连接被拒。机器B的IDE远程调试配置里,主机填机器A的IP,端口填你指定的数值,调试模式选「远程JVM」就可以了。
内容的提问来源于stack exchange,提问作者Austin
相关产品推荐
相关产品推荐

