【Java架构师】Maven中lombok那点事

简介: SpringBoot项目中Lombok需在maven-compiler-plugin中配置`annotationProcessorPaths`,确保编译期生成getter/setter等方法;而`excludes`则在打包时排除Lombok依赖,减小体积,因运行时已无需该库。

lombok.jpg

前言

创建一个普通的SpringBoot项目,如果添加了lombok依赖,pom.xml会自动生成这样一段配置代码:

image.gif



这样生成的意义是什么呢?

我们先来说第一个:

一、annotationProcessorPaths

<annotationProcessorPaths>
    <path>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </path>
</annotationProcessorPaths>

为什么 Lombok 要这样单独写在 maven-compiler-plugin 里,而不是只在 <dependencies> 里引入。

首先Lombok 不是像 Spring、MyBatis 那样的运行时库,它是一个✅ 编译期注解处理器(Annotation Processor)。

也就是说:

  • 它在你执行 mvn compile 时介入;
  • 扫描代码里的注解(例如 @Getter, @Builder);
  • 在编译阶段动态生成 getter/setter 等方法;
  • 这些方法直接进入 .class 文件;
  • 编译完成后,运行时根本不需要 Lombok。


1.1 Maven 默认不传递编译期处理器

默认情况下,Maven 的 maven-compiler-plugin

  • 只编译源代码;
  • 不会自动把编译期注解处理器(像 Lombok)加进去
  • 尤其是某些 IDE 或构建环境(CI)会因此报错:

“Cannot find symbol getXXX()”

因为 Lombok 没有被 javac 加载为 annotation processor。



1.2 annotationProcessorPaths 的作用

这一段配置:

<annotationProcessorPaths>
    <path>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </path>
</annotationProcessorPaths>

就是告诉 Maven:

编译时请显式地把 Lombok 注册为注解处理器(Annotation Processor)。

这样,javac 编译源码时,Lombok 的生成逻辑会被执行。

所以 @Getter, @Builder, @Slf4j 等注解才能生效。


1.3 如果不写会怎样?

编译后 .class 里就没有生成 getter/setter方法了。

可能会报如下的错:

[ERROR] cannot find symbol

 symbol:   method getName()

 location: variable user of type com.example.User



1.4 测试引发的新问题,不写也不会报错?

我创建了一个实体类,用来测试:

image.gif


image.gif


当我执行mvn clean package,发现还是可以成功编译打包,这是为什么呢?

根本原因就是maven3.6以上版本可以自动识别lombok,所以这里删掉也没事。



二、excludes

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <excludes>
            <exclude>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
            </exclude>
        </excludes>
    </configuration>
</plugin>

这里就很明确了,打包的时候排除lombok依赖包。因为你之前已经将注解编译为getter/setter方法了,.class字节码文件已经有了正常的getter/setter代码,所以运行时根本不需要再加载 Lombok 的 jar,而且还会增加jar包的体积。

目录
相关文章
|
29天前
|
消息中间件 架构师 Java
【Java架构师】各个微服务之间有哪些调用方式?
微服务拆分后需跨进程通信,常见方式包括HTTP调用(如RESTful、OpenFeign、@HttpExchange)、RPC框架(如Dubbo、gRPC、Thrift)、消息队列(如Kafka、RabbitMQ)及服务网格(如Istio)。不同场景下可依据性能、异步、跨语言等需求选择合适方案。
315 0
|
29天前
|
XML Android开发 数据格式
Android setContentView源码与原理分析
`setContentView` 是 Activity 显示界面的核心方法,其本质是将布局嵌入由 `PhoneWindow` 管理的 `DecorView` 中。系统首先创建包含状态栏、标题栏等的窗口模板(如 `screen_simple.xml`),再通过 `LayoutInflater` 将开发者指定的布局加载到 ID 为 `android.R.id.content` 的 `mContentParent` 容器内,最终在 `Activity` 恢复时由 `WindowManager` 将 `DecorView` 添加至窗口,触发测量与绘制流程,完成界面显示。
191 73
|
1月前
|
SQL 架构师 关系型数据库
【Java架构师体系课 | MySQL篇】⑤ 索引优化实战一
本文深入解析MySQL索引优化原理,涵盖联合索引使用、覆盖索引、索引下推、filesort排序机制及trace工具分析执行计划选择等内容,并结合实际案例提供索引设计原则与SQL优化策略。
106 5
|
27天前
|
Java Spring
IDEA调出services窗口
本教程分两步指导:首先点击指定选项,然后在Templates中添加Spring Boot并应用,即可调出services窗口,快速完成配置。
88 11
|
27天前
|
存储 Java
为什么JDK 9中把String的char[]改成了byte[]?
Java 9引入“Compact String”优化字符串存储:若字符均为Latin-1编码(单字节),则用byte[]存储,节省空间;否则仍用UTF-16。通过新增`coder`字段标识编码类型,提升存储效率并保持兼容性。
62 6
|
29天前
|
Linux Shell
Linux系统安装miniconda详细教程
本文介绍在CentOS 7系统中安装Miniconda的完整步骤:首先下载Miniconda安装包至/opt目录,接着执行安装脚本并按提示操作;安装完成后,将conda添加到环境变量,通过`conda init bash`和`source ~/.bashrc`配置生效,最终验证安装成功。
321 5
|
2月前
|
存储 Cloud Native 关系型数据库
PolarDB-PG IMCI实战解析:深度融合DuckDB,复杂查询性能最高百倍级提升
阿里云PolarDB PostgreSQL版创新融合DuckDB向量化引擎,推出IMCI列存索引,实现HTAP一体化。支持实时交易与复杂分析并行,查询性能提升60-100倍,兼容PG生态,秒级数据同步,助力企业高效挖掘数据价值。
319 0