如何从Bazel构建的srcjar产物自动生成标准jar文件?
Bazel构建proto输出编译后Jar的自动化方案
方案1:使用原生Java proto/gRPC规则直接输出Jar(推荐)
- 你拿到
.srcjar产物的核心原因是直接构建了规则暴露的源码生成类底层目标,这类目标本身就只负责生成Java源码、打包成srcjar中间产物,不会走编译流程。 - 实际上proto、gRPC的bazel规则已经和Java构建链路做了原生打通,不需要手动解压srcjar、编译源码、重新打包,直接在BUILD文件中声明Java专属的编译目标即可自动走完全流程:
# 加载所需构建规则 load("@rules_proto//proto:defs.bzl", "proto_library") load("@rules_java//java:defs.bzl", "java_proto_library") load("@rules_grpc_java//:java_grpc_library.bzl", "java_grpc_library") # 绑定proto源文件的基础目标 proto_library( name = "service_proto", srcs = glob(["*.proto"]), ) # 自动编译protobuf对应的Java代码,输出标准Jar java_proto_library( name = "service_java_proto", deps = [":service_proto"], ) # 自动编译gRPC对应的Java代码,输出标准Jar java_grpc_library( name = "service_java_grpc", srcs = [":service_proto"], deps = [":service_java_proto"], )
- 配置完成后执行
bazel build //:service_java_proto //:service_java_grpc,bazel输出目录下直接就是编译完成的.jar文件,全程无手动操作。
方案2:适配已生成的srcjar目标自动打包
- 如果你已经用proto-rules-grpc自动生成了固定的BUILD文件,不想调整生成逻辑,也不需要手动处理srcjar,直接新增一个
java_library目标,将srcjar作为源码输入即可,bazel原生支持识别srcjar格式,自动完成源码提取、编译、打包流程:
java_library( name = "service_compiled_jar", srcs = [":your_auto_generated_srcjar_target"], deps = [ # 补全proto和gRPC编译需要的依赖,比如protobuf-java、grpc-stub等 ], )
- 执行
bazel build //:service_compiled_jar即可直接拿到编译后的Jar产物,不需要写任何额外脚本处理中间文件。
注意:不要将srcjar放入
resources参数,否则会把未编译的srcjar包直接作为资源打入Jar,不会触发源码编译;放入srcs参数才能触发bazel的源码编译逻辑。
内容的提问来源于stack exchange,提问作者sphoenix
相关产品推荐
相关产品推荐

