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

为何java_binary的运行时依赖无法传递给java_test?

问题原因与解决方案

核心原因

Bazel的java_binary规则定位是生成可执行产物,而非作为供其他目标依赖的库。当java_test直接依赖java_binary时,Bazel不会将java_binary的依赖(比如//src/main/java/com/example/two)传递给测试目标——因为java_binary的依赖已经被打包进可执行文件本身,不需要对外暴露给依赖它的其他规则。

而java_library规则的设计目的就是被其他目标依赖,它会完整保留并传递自身的依赖链,所以测试依赖它时能自动获取所有必需的类路径。

解决方案

最规范的做法是重构代码结构,将业务逻辑抽离为java_library,让java_binary和java_test共同依赖这个库:

1. 定义业务逻辑库

java_library(
    name = "MyCommandLib",
    srcs = ["MyCommand.java"],
    visibility = ["//visibility:public"],
    deps = ["//src/main/java/com/example/two"],
)

2. 修改java_binary依赖该库

java_binary(
    name = "MyCommand",
    main_class = "com.example.MyCommand", # 替换为你的主类全名
    visibility = ["//visibility:public"],
    deps = [":MyCommandLib"],
)

3. 修改java_test依赖该库

java_test(
    name = "TestMyCommand",
    size = "small",
    srcs = ["TestMyCommand.java"],
    deps = [":MyCommandLib"],
)

这样测试代码就能正常获取//src/main/java/com/example/two的类,避免ClassDefNotFoundException。

如果暂时不想重构,也可以在java_test的deps里显式添加缺失的依赖,但这种方式维护成本高,后续依赖变更时容易遗漏,不推荐。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 05:37:10