3

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

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

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

是否可以在没有硬编码的情况下从命令行实现这一点jvm_flags

4

2 回答 2

2

尝试:

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

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

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

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

于 2020-02-28T19:34:28.313 回答
0

看起来您可以--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。

于 2020-12-09T14:36:43.710 回答