为何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
相关产品推荐
相关产品推荐

