更多BuildFarm/Bazel/Remote Execution API的文章见我的个人博客:
- Bazel 报错:/tmp/external/gcc_toolchain_x86_64_files/bin/x86_64-linux-gcc: No such file or directory 记录
- Bazel 编译 java 代码为独立运行的 jar 包的方法
- BuildFarm Server 简要分析
- BuildFarm Worker 简要分析
- BuildFarm Worker 配置自定义镜像
- Buildfarm 任务队列简要分析
- BuildFarm 低版本遇到的 re api 兼容性问题
- ByteStream API (proto version) 解析
- Logstream API (go version) 解析
- Remote Execution API (go version) 解析
- find 查找 Bazel 构建覆盖率文件的一个☝️坑
以buildfarm v2.10.2 https://github.com/bazelbuild/bazel-buildfarm 为例。
根目录下存在BUILD
文件,定义了构建规则。
load("//:jvm_flags.bzl", "add_opens_sun_nio_fs", "ensure_accurate_metadata")
package(
default_visibility = ["//src:__subpackages__"],
)
filegroup(
name = "configs",
srcs = ["logging.properties"],
visibility = ["//visibility:public"],
)
java_binary(
name = "buildfarm-server",
classpath_resources = [
":configs",
],
jvm_flags = ensure_accurate_metadata() + add_opens_sun_nio_fs(),
main_class = "build.buildfarm.server.BuildFarmServer",
visibility = ["//visibility:public"],
runtime_deps = [
"//src/main/java/build/buildfarm/server",
"@maven//:org_slf4j_slf4j_simple",
],
)
java_binary(
name = "buildfarm-shard-worker",
classpath_resources = [
":configs",
],
jvm_flags = ensure_accurate_metadata() + add_opens_sun_nio_fs(),
main_class = "build.buildfarm.worker.shard.Worker",
visibility = ["//visibility:public"],
runtime_deps = [
"//src/main/java/build/buildfarm/worker/shard",
"@maven//:org_slf4j_slf4j_simple",
],
)
java_binary
规则分别指定了buildfarm-server
和buildfarm-shard-worker
两个可运行程序。其中的main_class
指定了main函数所在的位置。
但是,如果直接运行构建指令,如
bazel build //src/main/java/build/buildfarm:buildfarm-shard-worker
然后运行,会报错:
#java -jar bazel-bin/src/main/java/build/buildfarm/buildfarm-shard-worker.jar --jvm_flag=-Djava.util.logging.config.file=$(pwd)/examples/logging.properties $(pwd)/examples/config.minimal.yml
no main manifest attribute, in bazel-bin/src/main/java/build/buildfarm/buildfarm-shard-worker.jar
提示找不到主类,查看编译后的jar包,发现没有指定主类:
[root@j63e03474.sqa.eu95 /home/jiaomian.wjw/bazel-buildfarm/bazel-buildfarm-2.10.2/bazel-bin/src/main/java/build/buildfarm]
#unzip -p buildfarm-shard-worker.jar META-INF/MANIFEST.MF
Manifest-Version: 1.0
Created-By: singlejar
要想运行这样构建后的产物,需要通过bazel run指令。
而想要构建出能独立运行的软件包,需要在构建指令的二进制包后加上后缀_deploy.jar
,这是一个约定。
#bazel build //src/main/java/build/buildfarm:buildfarm-shard-worker_deploy.jarINFO: Analyzed target //src/main/java/build/buildfarm:buildfarm-shard-worker_deploy.jar (0 packages loaded, 2 targets configured).
INFO: Found 1 target...
Target //src/main/java/build/buildfarm:buildfarm-shard-worker_deploy.jar up-to-date:
bazel-bin/src/main/java/build/buildfarm/buildfarm-shard-worker_deploy.jar
INFO: Elapsed time: 0.763s, Critical Path: 0.51s
INFO: 3 processes: 2 internal, 1 linux-sandbox.
INFO: Build completed successfully, 3 total actions
[root@j63e03474.sqa.eu95 /home/jiaomian.wjw/bazel-buildfarm/bazel-buildfarm-2.10.2/bazel-bin/src/main/java/build/buildfarm]
#unzip -p buildfarm-shard-worker_deploy.jar META-INF/MANIFEST.MF
Manifest-Version: 1.0
Created-By: singlejar
Main-Class: build.buildfarm.worker.shard.Worker
Multi-Release: true
参考:https://www.cnblogs.com/rongfengliang/p/12249593.html
附:手动编译jar包
bash-4.2$ javac -d bin src/com/alicloud/basic_tech/*.java
bash-4.2$ jar cvf mesh-executor.jar -C bin/ .
added manifest
adding: com/(in = 0) (out= 0)(stored 0%)
adding: com/alicloud/(in = 0) (out= 0)(stored 0%)
adding: com/alicloud/basic_tech/(in = 0) (out= 0)(stored 0%)
adding: com/alicloud/basic_tech/RMIServer.class(in = 923) (out= 570)(deflated 38%)
adding: com/alicloud/basic_tech/RemoteProcessBuilderImpl.class(in = 3947) (out= 1742)(deflated 55%)
adding: com/alicloud/basic_tech/RemoteProcessImpl.class(in = 4951) (out= 2292)(deflated 53%)
adding: com/alicloud/basic_tech/RemoteProcessBuilder.class(in = 914) (out= 351)(deflated 61%)
adding: com/alicloud/basic_tech/RemoteProcess.class(in = 412) (out= 252)(deflated 38%)