bazel - 如何将 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的文件传递时 - 一切正常。但是我想知道如何将包装器作为可执行文件传递。
解决方案
在运行操作中,您可以使用executable = ctx.executable._executable
.
ctx.actions.run的文档给出了这个例子https://github.com/bazelbuild/examples/blob/master/rules/actions_run/execute.bzl
编辑我认为有一些混淆::my-runner
已经是一个带有包装脚本的 java_binary。
推荐阅读
- javascript - 我的 laravel vue js 项目中的所有 Put & Delete 路由方法抛出 302 错误
- wiql - Azure DevOps 查询 - 返回特定用户在某个时间范围内编辑的工作项
- bodypix - 将 bodypix js 模型转换为 pb 。然后将 pb 转换为 tflite
- android - 在 Android 11 中创建 CSV 文件返回错误“java.io.FileNotFoundException: EPERM (Operation not allowed)”
- java - 运行 neo4j 时遇到错误:无法在 'dedicatedworkerglobalscope' 上执行 'postmessage' 数据无法克隆出内存
- android - 尝试对本地 Web api(离子 android 应用程序)的 http 请求时连接被拒绝
- r - 使用相异矩阵和数据矩阵作为R中聚类输入的区别?
- sql - 基于另一个表从一个 SQL 表中删除
- javascript - 结合日期(日-月-年)和时间(hh:mm am/pm)并将其转换为 unix 格式(javascript)
- python - Python - 如何使用变量作为值对齐?