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

自定义规则中调用依赖JRE/JDK的二进制文件无法找到JVM

问题分析与解决方案

核心原因

1. Bazel沙箱的严格限制

执行bazel run //tool_wrapper时,Bazel默认不启用严格沙箱,脚本可以直接访问系统PATH中的JDK。但自定义规则执行阶段,Bazel会启用严格沙箱:沙箱内的环境变量(包括PATH)被重置,仅包含Bazel构建过程中声明的依赖资源,系统级的JDK不在沙箱可访问范围内,因此找不到Java环境。

2. Java工具的硬编码路径

从错误日志可以看出,你调用的Commonapi-core-generator-linux-x86_64有硬编码的JRE查找逻辑:优先去外部依赖的external/tool/jre/bin/java路径寻找Java,而你的BUILD文件仅依赖了该工具二进制本身,没有将对应的JRE目录/文件声明为data依赖,导致沙箱内不存在这个JRE路径,工具自然找不到。

解决步骤

步骤1:补充JRE依赖

检查@external//tools外部依赖是否包含JRE目录,若存在,将JRE相关资源添加到sh_binary的data列表中:

sh_binary(
  name = "tool_wrapper",
  srcs = ["tool_wrapper.sh"],
  data = [
      "@external//tools:binary",
      "@external//tools/jre", # 或具体到java可执行文件:@external//tools/jre/bin/java
  ],
  args = ["$(location @external//tools:binary)"],
)

步骤2:显式指定Java环境给工具

如果工具支持通过环境变量或参数指定Java路径,修改tool_wrapper.sh显式传入:

#!/bin/bash
# 获取依赖中JRE的路径
JAVA_PATH=$(location @external//tools/jre/bin/java)
# 设置JAVA_HOME环境变量
export JAVA_HOME=$(dirname $(dirname "$JAVA_PATH"))
# 调用工具
"$1" --help

若工具支持直接传递Java路径参数,也可以直接通过参数传入:

#!/bin/bash
JAVA_HOME=$(dirname $(dirname $(location @external//tools/jre/bin/java)))
"$1" --java-home "$JAVA_HOME" --help

步骤3:临时禁用沙箱(不推荐)

如果上述方法无法生效,可在自定义规则的ctx.actions.run()中添加sandbox = "never"参数,强制关闭沙箱。但此方法会破坏Bazel构建的可复现性,仅作为临时调试方案:

ctx.actions.run(
    executable = ctx.executable.tool_wrapper,
    arguments = [...],
    sandbox = "never",
)

内容的提问来源于stack exchange,提问作者rumbleD5

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 00:53:27