【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包的体积。

目录
相关文章
如何关掉Parsed mapper file日志打印
如何关掉Parsed mapper file日志打印
806 1
|
8月前
|
JavaScript 安全 Java
Maven 4 终于来了!5 个最实用的新特性,看这一篇就够了(附超简单示例)
Apache Maven 4.0(2025年底GA)是20年来最大架构升级,非颠覆而是进化:兼容现有pom.xml,无需大改即可享受5大实用新特性——子模块自动发现、父版本自动推断、原生动态版本、消费者POM精简发布、智能构建恢复。仅需JDK 17+,平滑迁移,更简洁、更智能、更可靠!
1683 2
|
SQL Prometheus 监控
数据库连接池选型 Druid vs HikariCP
springboot 现在官方默认的数据库连接池是 HikariCP,HikariCP的性能从测试的数据上来看也是最高的。
数据库连接池选型 Druid vs HikariCP
|
11月前
|
消息中间件 架构师 Java
【Java架构师】各个微服务之间有哪些调用方式?
微服务拆分后需跨进程通信,常见方式包括HTTP调用(如RESTful、OpenFeign、@HttpExchange)、RPC框架(如Dubbo、gRPC、Thrift)、消息队列(如Kafka、RabbitMQ)及服务网格(如Istio)。不同场景下可依据性能、异步、跨语言等需求选择合适方案。
1599 0
|
8月前
|
存储 NoSQL 前端开发
告别踩坑!若依图片验证码实现与改造指南
若依(RuoYi)框架中图片验证码的完整实现逻辑、核心代码和定制化方法,我会从实现原理、核心代码拆解、关键配置、定制化改造四个维度讲解,覆盖验证码生成、存储、校验全流程,让你既能理解原理,也能按需修改验证码样式 / 规则。
835 11
|
10月前
|
JSON 安全 fastjson
使用阿里巴巴 Fastjson 替代 Spring Boot 默认的 Jackson
本文介绍在 Spring Boot 项目中如何替换默认的 Jackson,集成阿里巴巴 Fastjson 作为 JSON 处理框架。内容涵盖 Fastjson 与 Jackson 的核心对比、依赖配置、自定义消息转换器、null 值统一处理及循环引用控制,并提供安全建议与最佳实践,助你高效、安全地使用 Fastjson。
|
11月前
|
SQL 架构师 关系型数据库
【Java架构师体系课 | MySQL篇】⑤ 索引优化实战一
本文深入解析MySQL索引优化原理,涵盖联合索引使用、覆盖索引、索引下推、filesort排序机制及trace工具分析执行计划选择等内容,并结合实际案例提供索引设计原则与SQL优化策略。
455 5
|
Java Linux 程序员
记录:Unsatisfied dependency expressed through field 'XxxService'...【亲测有效】
记录:Unsatisfied dependency expressed through field 'XxxService'...【亲测有效】
2124 1
|
NoSQL Java 数据库连接
SpringBoot框架
Spring Boot 是 Spring 家族中最流行的框架,旨在简化 Spring 应用的初始搭建与开发。它通过自动配置、起步依赖和内嵌服务器三大核心功能,大幅减少配置复杂度,提升开发效率。开发者可快速构建独立运行的 Web 应用,并支持多种数据访问技术和第三方集成。
|
Java 数据库连接 开发者
了解在什么情况下应当使用@MapperScan注解
总结而言,`@MapperScan`注解的使用能大大简化MyBatis与Spring Boot结合时的配置工作,特别是在中大型项目中,它能有效减轻开发人员的负担,确保持久化层的整洁性和可维护性。在设计系统的初期就考虑使用 `@MapperScan`注解,可以为后续的项目维护打下良好基础。
1565 14

热门文章

最新文章