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

目录
相关文章
|
6月前
|
消息中间件 架构师 Java
【Java架构师】各个微服务之间有哪些调用方式?
微服务拆分后需跨进程通信,常见方式包括HTTP调用(如RESTful、OpenFeign、@HttpExchange)、RPC框架(如Dubbo、gRPC、Thrift)、消息队列(如Kafka、RabbitMQ)及服务网格(如Istio)。不同场景下可依据性能、异步、跨语言等需求选择合适方案。
1250 0
|
6月前
|
自然语言处理 IDE Java
Apache NetBeans 28 发布 - Java 等多语言开源跨平台 IDE
Apache NetBeans 28 (macOS, Linux, Windows) - Java 等多语言开源跨平台 IDE
236 5
Apache NetBeans 28 发布 - Java 等多语言开源跨平台 IDE
|
3月前
|
JavaScript 安全 Java
Maven 4 终于来了!5 个最实用的新特性,看这一篇就够了(附超简单示例)
Apache Maven 4.0(2025年底GA)是20年来最大架构升级,非颠覆而是进化:兼容现有pom.xml,无需大改即可享受5大实用新特性——子模块自动发现、父版本自动推断、原生动态版本、消费者POM精简发布、智能构建恢复。仅需JDK 17+,平滑迁移,更简洁、更智能、更可靠!
800 2
|
3月前
|
人工智能 安全 Go
使用MCP官方 Go SDK实现自己的MCP server
MCP(Model Context Protocol)是Anthropic推出的标准化协议,让AI安全调用外部工具。本文带你用官方Go SDK从零实现MCP服务器,支持“获取当前时间”和“读取本地文件”两个工具,并在VS Code中快速测试调用。(239字)
544 1
|
5月前
|
JSON 安全 fastjson
使用阿里巴巴 Fastjson 替代 Spring Boot 默认的 Jackson
本文介绍在 Spring Boot 项目中如何替换默认的 Jackson,集成阿里巴巴 Fastjson 作为 JSON 处理框架。内容涵盖 Fastjson 与 Jackson 的核心对比、依赖配置、自定义消息转换器、null 值统一处理及循环引用控制,并提供安全建议与最佳实践,助你高效、安全地使用 Fastjson。
|
6月前
|
SQL 架构师 关系型数据库
【Java架构师体系课 | MySQL篇】⑤ 索引优化实战一
本文深入解析MySQL索引优化原理,涵盖联合索引使用、覆盖索引、索引下推、filesort排序机制及trace工具分析执行计划选择等内容,并结合实际案例提供索引设计原则与SQL优化策略。
333 5
|
4月前
|
前端开发 Java Nacos
application.yml和bootstrap.yml这两个配置文件有什么区别?
`bootstrap.yml` 与 `application.yml` 是 Spring Boot/Cloud 项目中的两类配置文件。前者用于应用启动前加载,主要配置远程配置中心(如 Nacos)、加密等关键信息,优先级高;后者是默认主配置,用于常规配置如端口、数据库等。自 Spring Boot 2.4+ 起,默认不再启用 `bootstrap` 机制,推荐使用 `spring.config.import` 在 `application.yml` 中统一导入配置,以简化流程、降低复杂度。纯 Spring Boot 应用不加载 `bootstrap.yml`。
732 0
|
6月前
|
Linux Python
Anaconda和Miniconda在Linux系统下迁移虚拟环境
将A服务器的Miniconda虚拟环境loonflow3通过`conda list --explicit`导出配置,并打包env目录为tar.gz文件,使用scp传输至B服务器后解压至对应路径,再激活环境即可完成迁移。
566 5
|
Java Spring 开发者
Spring Boot 常用注解详解:让你的开发更高效
本文详细解析Spring Boot常用注解,涵盖配置、组件、依赖注入、Web请求、数据验证、事务管理等核心场景,结合实例帮助开发者高效掌握注解使用技巧,提升开发效率与代码质量。
1645 2
|
10月前
|
NoSQL Java 数据库连接
SpringBoot框架
Spring Boot 是 Spring 家族中最流行的框架,旨在简化 Spring 应用的初始搭建与开发。它通过自动配置、起步依赖和内嵌服务器三大核心功能,大幅减少配置复杂度,提升开发效率。开发者可快速构建独立运行的 Web 应用,并支持多种数据访问技术和第三方集成。