返回

Bazel 构建中 Lombok AnnotationProcessor 故障:全面指南

java

Lombok AnnotationProcessor 在 Bazel 构建中故障:全面指南

摘要

在使用 Bazel 构建 Java 项目时,Lombok AnnotationProcessor 可能会遇到问题,导致构建失败。本文将深入探讨此问题,并提供详细的解决方案。

问题概述

在 Bazel 构建中,Lombok AnnotationProcessor 可能会出现故障,并抛出以下错误:

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 构建中的 Lombok:

1. 添加 Lombok Maven 存储库

在项目根目录的 WORKSPACE 文件中,添加 Lombok Maven 存储库:

maven_jar(
    name = "lombok",
    artifact = "org.projectlombok:lombok:1.18.26",
    sha256 = "d210c14f733048322449f41fd36778c453c63fe05725b6885689b7b0d8d1b79d",
)

2. 构建 Lombok Java 插件

创建一个新的 Bazel 构建文件(如 lombok_plugin.bzl),用于定义 Lombok Java 插件:

load("@rules_java//java:defs.bzl", "java_plugin")

def lombok_plugin(name, processor_class):
  """Lombok Java plugin."""
  java_plugin(
      name = name,
      processor_class = processor_class,
      deps = [
          "//external:lombok",
      ],
  )

3. 在 BUILD 文件中配置 Lombok 插件

BUILD 文件中,使用 lombok_plugin 宏为 Java 库定义 Lombok 插件:

load("//:lombok_plugin.bzl", "lombok_plugin")

java_library(
    name = "worker_lib",
    srcs = glob(["**/src/main/java/** /*.java"]),
    plugins = [":lombok_plugin"],  # Apply the Lombok plugin
    deps = ["//backend/common"],
    visibility = ["//visibility:public"],
)

其他提示

  • 确保使用 Java 11 或更高版本。
  • 确保已安装 Bazel。
  • 如果问题仍然存在,请参阅 Lombok 文档或 Bazel 社区以获取更多帮助。

结论

通过正确配置 Lombok,可以解决在 Bazel 构建中出现的 AnnotationProcessor 故障问题。本文提供了分步指南,以帮助你成功使用 Lombok。

常见问题解答

  1. 什么是 Lombok?
    Lombok 是一种 Java 库,允许开发人员编写更简洁、更易于维护的代码,而无需编写样板代码。

  2. 为什么需要在 Bazel 中配置 Lombok?
    Bazel 是一个构建工具,它需要明确配置才能使用外部库,如 Lombok。

  3. 为什么会出现 AnnotationProcessor 故障?
    AnnotationProcessor 故障通常是由于 Lombok 未正确配置或 Java 版本太低。

  4. 除了本文提供的解决方案,还有其他解决方法吗?
    其他解决方法包括在 Bazel 构建命令中添加 --javacopt=-Amodules 标志,但这可能不适用于所有项目。

  5. 是否可以使用其他库来替代 Lombok?
    可以,但 Lombok 是使用最广泛的库,并得到广泛的支持。