You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Mill构建工具时,IntelliJ调试器无法命中Scala代码断点求助

解决Mill + IntelliJ Scala调试断点不触发问题

核心问题根源

你当前的JAVA_OPTS配置仅作用于Mill本身的JVM进程,而Mill会fork独立的子进程来运行你的应用/测试代码,调试参数并没有传递到实际执行业务代码的子进程中,导致断点无法关联。

调试主程序的步骤

  1. 直接给Mill命令传递调试参数
    不要用全局JAVA_OPTS,而是在运行Mill时通过-J参数把调试选项直接传给目标JVM:

    mill -J-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005 foo.run
    

    这个命令会让你的应用代码所在的JVM等待调试器连接,而非Mill本身。

  2. 配置IntelliJ远程调试

    • 打开IntelliJ的Run/Debug Configurations,新建Remote JVM Debug
    • 端口设置为5005,和命令中的端口一致
    • Use module classpath选择你的项目模块(比如foo.main,导入Mill项目后IntelliJ会自动生成对应模块)
    • 点击Debug连接,此时程序会开始执行,断点即可触发

调试单元测试的步骤

和主程序逻辑一致,只是目标命令换成测试命令,端口可以换一个避免冲突:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 21:52:16