如何通过 'ctx.actions.run(...)' 调试由 Bazel 规则执行的 'java_binary' 目标?

How do I debug a 'java_binary' target executed by a Bazel rule via 'ctx.actions.run(...)'?

我的工作区中有一个 java_binary 目标,稍后我将其作为可执行文件传递给规则内的 ctx.actions.run。到目前为止一切顺利。

现在我想在 Bazel 执行规则时调试此 java_binary。为了附加调试器,我需要在调试模式下使用 java_binary 运行。到目前为止,我唯一想到的就是在 java_binary 上设置 jvm_flags。我能够让它工作。但我想知道是否有一种方法可以从命令行实现它而不是将其烘焙到 java_binary.

java_binary(
    ...
    jvm_flags = [
        "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8000"
    ],
)

是否可以从命令行实现这一点而无需硬编码jvm_flags

尝试:

bazel run //:my-target -- --debug

一种策略是 运行 使用 --subcommands 进行构建,这将告诉 bazel 在构建过程中打印出所有 运行ning 的命令。然后找到与您感兴趣的 java_binary 调用对应的命令行。然后您可以 copy/paste 该命令(包括 cd 部分)并修改它以包含调试标志,并像调试任何其他进程一样对其进行调试。

另请注意,java_binary 输出包含 --debug[=<port>] 标志的包装脚本,因此这应该是所有需要添加到命令行的内容。

另请注意,--subcommands 只会打印构建期间实际执行的命令,因此完全缓存/完全增量构建将不会打印任何内容。您可能需要执行 clean,或删除您感兴趣的操作的一些输出,以便 bazel 运行 使用该命令。

看来您可以在 -- 之后将 --jvm_flag 选项作为程序选项的一部分传递。

构建:

java_binary(
    name = "extract",
    main_class = "com.pkg.Main",
    resources = glob(["src/main/resources/**/*"]),
)

命令行界面:

bazel run //:extract -- --jvm_flag="-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=7942" -path %cd%\config.json

似乎 --jvm_flag 选项需要紧跟在 -- 之后,在程序选项之前(示例中的 -path)。这是 Bazel 3.7.0.