为什么一定要加Lombok插件,为什么加依赖还不行
Why do I have to add Lombok plugin, why adding dependency is not enough
我很好奇为什么我必须添加 Lombok
插件。为什么向 pom.xml
添加依赖项是不够的,例如 Mockito
?
您必须了解 Lombok 的实际工作原理。
这里有两部分:
- 注释,例如@Data、@ToString、...
- 那个"plugin"其实生成对应的代码
您需要对 lombok 的依赖,以便 compiler/IDE 可以自行解析注释。 (需要导入注释,就像您在源代码中使用的任何其他 "element" 一样)。但这只能确保您的编译器/IDE知道这些是有效的注释。
真正的技巧是,稍后,当代码被编译成 class 文件时,lombok 的 "active" 部分可用于实际 生成 代码.
这类似于java bean validation。您需要在编译时导入一个 JAR,这样所有不同的验证注释都是已知的,并且可以在您的源代码中使用。但是为了主动验证对象,您稍后需要一些其他组件来执行此操作(这里的区别是验证发生在运行时,而 Lombok 仅在编译时进行)。
请注意:"annotation usage/handling" 的第二种方式是更常见的路径。在您关于 JUnit 和 @RunWith 的示例中:该注释告诉 JUnit 在 runtime 使用那个 mockito runner class(而不是它的自己的跑步者实现)。然后那个 mockito runner 知道在运行时用所有其他注释做什么。同样的故事:需要知道源代码中存在的注释,对于活动部分,某些组件在运行时执行某些操作。
当然,您也可以使用注释来影响构建任务,但如前所述,这种情况不太常见,而且要复杂得多。
Lombok 是所谓的 注释处理器 ,Mockito 是 "just" 常规 Java 库。注释处理器
- 定义可以在 Java 代码中使用的注释,并且
- 使用这些注释编译源代码时,它们会挂接到编译过程并更改输入源代码或生成新代码。
javac,JDK 附带的 Java 编译器,自动检测类路径上的注释处理器并调用它们,以便它们可以处理它们的注释并生成代码。因此,当您将 Lombok 添加到 pom.xml 并调用 mvn package
(它调用 javac)时,一切都很好:Lombok 现在位于类路径中并由 javac 调用,您可以在代码中使用 Lombok 的注释。
javac的主要目的是将有效的Java代码编译成字节码。但是,当您编写 Java 代码时,大多数时候代码是 无效 。因此,像 Eclipse 或 IntelliJ IDEA 这样的高级 IDE 专注于帮助开发人员,即使他们的代码无法编译。如果他们只使用 javac 作为分析和编译 Java 代码的唯一手段,他们将无法为开发人员提供太多帮助。代码大纲、依赖分析、寻找方法调用目标等功能也必须尽可能处理无效代码。
为了实现这一点,Eclipse 和 IntelliJ IDEA 都有自己的 Java 编译器。例如,Eclipse 的编译器使用完全不同的代码抽象语法树 (AST) 表示。它主要是 Lombok 运行的 AST。因此,Lombok 为每个注解提供了两个注解处理程序:一个用于 javac,一个用于 Eclipse。这就是需要在 Eclipse 中安装 Lombok 的原因:也能够连接到 Eclipse 的内部编译器。
我很好奇为什么我必须添加 Lombok
插件。为什么向 pom.xml
添加依赖项是不够的,例如 Mockito
?
您必须了解 Lombok 的实际工作原理。
这里有两部分:
- 注释,例如@Data、@ToString、...
- 那个"plugin"其实生成对应的代码
您需要对 lombok 的依赖,以便 compiler/IDE 可以自行解析注释。 (需要导入注释,就像您在源代码中使用的任何其他 "element" 一样)。但这只能确保您的编译器/IDE知道这些是有效的注释。
真正的技巧是,稍后,当代码被编译成 class 文件时,lombok 的 "active" 部分可用于实际 生成 代码.
这类似于java bean validation。您需要在编译时导入一个 JAR,这样所有不同的验证注释都是已知的,并且可以在您的源代码中使用。但是为了主动验证对象,您稍后需要一些其他组件来执行此操作(这里的区别是验证发生在运行时,而 Lombok 仅在编译时进行)。
请注意:"annotation usage/handling" 的第二种方式是更常见的路径。在您关于 JUnit 和 @RunWith 的示例中:该注释告诉 JUnit 在 runtime 使用那个 mockito runner class(而不是它的自己的跑步者实现)。然后那个 mockito runner 知道在运行时用所有其他注释做什么。同样的故事:需要知道源代码中存在的注释,对于活动部分,某些组件在运行时执行某些操作。
当然,您也可以使用注释来影响构建任务,但如前所述,这种情况不太常见,而且要复杂得多。
Lombok 是所谓的 注释处理器 ,Mockito 是 "just" 常规 Java 库。注释处理器
- 定义可以在 Java 代码中使用的注释,并且
- 使用这些注释编译源代码时,它们会挂接到编译过程并更改输入源代码或生成新代码。
javac,JDK 附带的 Java 编译器,自动检测类路径上的注释处理器并调用它们,以便它们可以处理它们的注释并生成代码。因此,当您将 Lombok 添加到 pom.xml 并调用 mvn package
(它调用 javac)时,一切都很好:Lombok 现在位于类路径中并由 javac 调用,您可以在代码中使用 Lombok 的注释。
javac的主要目的是将有效的Java代码编译成字节码。但是,当您编写 Java 代码时,大多数时候代码是 无效 。因此,像 Eclipse 或 IntelliJ IDEA 这样的高级 IDE 专注于帮助开发人员,即使他们的代码无法编译。如果他们只使用 javac 作为分析和编译 Java 代码的唯一手段,他们将无法为开发人员提供太多帮助。代码大纲、依赖分析、寻找方法调用目标等功能也必须尽可能处理无效代码。
为了实现这一点,Eclipse 和 IntelliJ IDEA 都有自己的 Java 编译器。例如,Eclipse 的编译器使用完全不同的代码抽象语法树 (AST) 表示。它主要是 Lombok 运行的 AST。因此,Lombok 为每个注解提供了两个注解处理程序:一个用于 javac,一个用于 Eclipse。这就是需要在 Eclipse 中安装 Lombok 的原因:也能够连接到 Eclipse 的内部编译器。