首页 > 解决方案 > 如何将 java_binary 生成的可执行包装器传递给 ctx.actions.run

问题描述

我正在尝试了解有关java_binary. 所以,如果我有类似的代码:

java_binary(
  name = "my-runner",
  visibility = ["//visibility:public"],
  srcs = glob(["src/main/java/**/*.java"]),
  main_class = "my.awesome.package.MyRunner",
)

当我运行时bazel build MyMainClass- 一切正常 - 我可以看到生成了两个文件 - 一个 jar 文件和一个包装脚本。

根据官方文档

使用包装脚本优于 java -jar,因为它还传递 JVM 标志和加载本机库的选项。

这就是我无法解决的问题 - 我应该如何访问该包装脚本?

我试过的是:

some_rule = rule(
    _some_rule_impl,
    attrs = {
        "_executable": attr.label(
           cfg = "host",
           executable = True,
           default=":my-runner"
        ),
        ...
    }
  )

_some_rule_impl我试图将可执行文件传递给ctx.actions.run- 并且我收到一个错误,即属性必须生成单个文件。

当我my-runner_deploy_deploy.jar作为可以传递给java的文件传递时 - 一切正常。但是我想知道如何将包装器作为可执行文件传递。

标签: bazel

解决方案


在运行操作中,您可以使用executable = ctx.executable._executable.

ctx.actions.run的文档给出了这个例子https://github.com/bazelbuild/examples/blob/master/rules/actions_run/execute.bzl

编辑我认为有一些混淆::my-runner已经是一个带有包装脚本的 java_binary。


推荐阅读