使用Mill构建工具时,IntelliJ调试器无法命中Scala代码断点求助
解决Mill + IntelliJ Scala调试断点不触发问题
核心问题根源
你当前的JAVA_OPTS配置仅作用于Mill本身的JVM进程,而Mill会fork独立的子进程来运行你的应用/测试代码,调试参数并没有传递到实际执行业务代码的子进程中,导致断点无法关联。
调试主程序的步骤
直接给Mill命令传递调试参数
不要用全局JAVA_OPTS,而是在运行Mill时通过-J参数把调试选项直接传给目标JVM:mill -J-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005 foo.run这个命令会让你的应用代码所在的JVM等待调试器连接,而非Mill本身。
配置IntelliJ远程调试
- 打开IntelliJ的
Run/Debug Configurations,新建Remote JVM Debug - 端口设置为
5005,和命令中的端口一致 Use module classpath选择你的项目模块(比如foo.main,导入Mill项目后IntelliJ会自动生成对应模块)- 点击
Debug连接,此时程序会开始执行,断点即可触发
- 打开IntelliJ的
调试单元测试的步骤
和主程序逻辑一致,只是目标命令换成测试命令,端口可以换一个避免冲突:
mill -J-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5006 foo.test
然后在IntelliJ新建另一个远程调试配置,端口设为5006,连接后调试测试代码即可。
额外排查点
- 确认编译带调试信息:Mill默认编译时会包含调试信息,如果你的build.sc里自定义了
compileOptions,确保没有添加-g:none这类禁用调试信息的参数。如果需要显式开启,可在foo模块中添加:override def compileOptions = super.compileOptions ++ Seq("-g:vars") - 同步代码与编译产物:修改代码后先执行
mill foo.compile(主程序)或mill foo.test.compile(测试),确保IntelliJ中的代码和实际运行的字节码一致,避免因代码不一致导致断点失效。 - 检查断点设置:确保断点打在可执行代码行上(比如不要打在空行、注释或仅变量声明的行)。
内容的提问来源于stack exchange,提问作者bwbecker
相关产品推荐
相关产品推荐

