Bazel无法找到@local_jdk仓库的问题解决求助
Bazel找不到@local_jdk的解决办法
问题情况
跟着在线教程把Java JNI头文件加到cc_library里时,一直报这个错:
no such package '@@[unknown repo 'local_jdk' requested from @@]//': The repository '@@[unknown repo 'local_jdk' requested from @@]' could not be resolved: No repository visible as '@local_jdk' from main repository
我的BUILD文件代码是这样的:
cc_library( name = "cpp_library", hdrs = [ "@local_jdk//:jni_header", ":generate_cplus_headers"], srcs = _CPP_srcs, includes = ["headers"], toolchains = ["@bazel_tools//tools/jdk:jdk", "@bazel_tools//tools/jdk:current_java_runtime"] )
使用环境:
- Bazel 8
- MacOS(Intel)
- Java 21
解决步骤
1. 手动配置JDK仓库
Bazel 8不会自动配置@local_jdk仓库,得在WORKSPACE文件里手动添加配置,有两种方法可选:
方法一:用Bazel自带的JDK规则
直接在WORKSPACE里添加这段代码:
load("@bazel_tools//tools/jdk:default_java_toolchain.bzl", "default_java_toolchain") default_java_toolchain(name = "local_jdk") # 注册工具链 register_toolchains("@bazel_tools//tools/jdk:toolchain")
方法二:自定义JDK路径(适合指定特定Java版本)
如果你的Java 21安装路径不是默认位置,先在WORKSPACE里引入管理JVM依赖的rules_jvm_external:
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") http_archive( name = "rules_jvm_external", sha256 = "d5a0845c516e34b47154580bda2457420f6f79f74f4a5c558047b30543498c81", strip_prefix = "rules_jvm_external-5.3.0", url = "https://github.com/bazelbuild/rules_jvm_external/archive/refs/tags/v5.3.0.zip", ) load("@rules_jvm_external//:repositories.bzl", "rules_jvm_external_deps") rules_jvm_external_deps() load("@rules_jvm_external//:setup.bzl", "rules_jvm_external_setup") rules_jvm_external_setup()
然后注册你的本地Java 21路径,把下面的path换成你实际的安装路径(比如/Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home):
register_local_jdk( name = "local_jdk", path = "你的Java 21安装路径", )
2. 直接替换BUILD里的依赖引用
嫌配置麻烦的话,直接把BUILD里的@local_jdk//:jni_header换成@bazel_tools//tools/jdk:jni_header,用Bazel自带的JNI头文件依赖,不用额外配置local_jdk仓库,修改后的BUILD文件:
cc_library( name = "cpp_library", hdrs = [ "@bazel_tools//tools/jdk:jni_header", ":generate_cplus_headers"], srcs = _CPP_srcs, includes = ["headers"], toolchains = ["@bazel_tools//tools/jdk:toolchain"] )
3. 检查配置是否生效
运行下面的命令,要是能返回JDK相关的目标,说明配置成功了:
bazel query @local_jdk//...
内容的提问来源于stack exchange,提问作者rkesters
相关产品推荐
相关产品推荐

