使用Bazel构建时Lombok注解处理器执行失败
Bazel构建时Lombok注解处理器执行失败
我帮你分析下这个问题:你遇到的是Lombok在JDK9+模块系统下的权限访问冲突,根源在于你使用的Lombok 1.18.6版本太老,还没适配JDK9之后的模块封装机制,它的注解处理器会尝试反射访问JDK内部的受限API,而JDK默认不允许未命名模块访问这些内部类,所以抛出了InaccessibleObjectException。
先把你的问题信息整理下:
我已经通过java插件配置了Lombok,但尝试构建Bazel项目时失败,报错如下:
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make field private com.sun.tools.javac.processing.JavacProcessingEnvironment$DiscoveredProcessors com.sun.tools.javac.processing.JavacProcessingEnvironment.discoveredProcs accessible: module jdk.compiler does not "opens com.sun.tools.javac.processing" to unnamed module @21a772cf当前的Bazel配置如下:
java_plugin( name = "lombok_plugin", processor_class = "lombok.launch.AnnotationProcessorHider$AnnotationProcessor", deps = [ "lombok-1.18.6.jar" , ], ) java_library( name = "worker_lib", srcs = glob(["**/src/main/java/**/*.java"]), plugins = [":lombok_plugin"], # Apply the Lombok plugin deps = ["//backend/common"], visibility = ["//visibility:public"], )
下面给你两个可行的解决办法:
方法一:升级Lombok版本(推荐)
从Lombok 1.18.20版本开始,官方已经适配了JDK9+的模块系统,不再依赖这些受限的内部API,能彻底解决这类权限问题。你只需要把Lombok的依赖替换成1.18.20及以上的版本,比如1.18.24:
java_plugin( name = "lombok_plugin", processor_class = "lombok.launch.AnnotationProcessorHider$AnnotationProcessor", deps = [ "lombok-1.18.24.jar", # 替换为新版本 ], )
升级后不需要额外添加编译参数,直接重新构建即可。
方法二:添加JVM编译参数(临时方案)
如果暂时无法升级Lombok,你可以通过给Java编译器添加--add-opens参数,开放对应的模块权限给未命名模块。你可以把参数配置在java_plugin或者java_library中:
配置在java_plugin中
java_plugin( name = "lombok_plugin", processor_class = "lombok.launch.AnnotationProcessorHider$AnnotationProcessor", deps = [ "lombok-1.18.6.jar", ], javacopts = [ "--add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED", "--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED", "--add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED", "--add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED", ], )
或者配置在java_library中
java_library( name = "worker_lib", srcs = glob(["**/src/main/java/**/*.java"]), plugins = [":lombok_plugin"], deps = ["//backend/common"], visibility = ["//visibility:public"], javacopts = [ "--add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED", "--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED", "--add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED", "--add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED", ], )
另外还要注意,确保Bazel构建使用的JDK版本和你的Lombok版本适配,尽量避免用太老的Lombok搭配新JDK。
备注:内容来源于stack exchange,提问作者user1614862
相关产品推荐
相关产品推荐

