Bazel v4.0.0构建报错「Worker process did not return a WorkResponse」如何排查根因?
我之前也碰到过这个特别模糊的报错,简直摸不着头脑!结合你给出的BUILD文件,咱们一步步来排查根源:
1. 先解锁详细日志,挖出真实错误
Bazel默认会把注解处理器的报错藏得很深,你可以加上两个参数重新构建,把worker进程的所有输出都打出来:
bazel build //your/package:java --verbose_failures --worker_verbose
这俩参数会帮你看到处理器运行时的具体异常——比如类找不到、空指针、逻辑报错这些真正的问题,而不是现在这个模糊的提示。
2. 检查注解处理器的依赖是否完整
你的java_plugin目标有没有把处理器需要的依赖都加上?比如MyProcessor如果用到了项目里的其他类或者第三方库,必须给java_plugin添加deps属性:
java_plugin( name = "my_processor", processor_class = "mypackage.MyProcessor", deps = [ # 在这里补上MyProcessor依赖的所有库 ":core_utils", "@maven//:com_google_guava_guava", ], )
很多时候处理器编译过了,但运行时缺依赖,worker进程直接崩溃,就会返回这个无语的错误。
3. 单独验证处理器本身能否正常运行
你可以先单独编译处理器,然后直接用Java命令跑一下,看看它本身有没有问题:
# 先编译处理器目标 bazel build //your/package:my_processor # 用Java命令执行(根据你的实际输出路径调整) java -cp $(bazel info bazel-bin)/your/package/my_processor_deploy.jar mypackage.MyProcessor
如果处理器本身代码有初始化错误或者逻辑bug,这样能快速定位,不用通过Bazel的worker间接排查。
4. 试试禁用worker模式验证
Bazel 4.0.0的Java注解处理器worker模式有一些已知的兼容性问题,你可以先禁用worker模式构建:
bazel build //your/package:java --strategy=Javac=standalone
如果禁用后能正常构建,或者抛出了清晰的错误,那就是worker模式和你的处理器不兼容。这时候要么调整处理器代码适配worker,要么考虑升级Bazel到5.x或6.x版本——后续版本对Java处理器的支持稳定很多。
5. 核对处理器类的全路径是否正确
最后再仔细检查processor_class的值,是不是和MyProcessor的实际包名+类名完全一致?比如实际类是com.mypackage.MyProcessor,但你写的是mypackage.MyProcessor,就会导致worker找不到类直接崩溃。
内容的提问来源于stack exchange,提问作者Bart Swennenhuis

