文章目录
一、问题分析
我在idea上写java代码,使用了lombok的@data功能,本来没问题,但是加入了mapstruct框架依赖就不行了,虽然代码没报错,但是编译后的class里面没有了get,set方法了。
报错截图:
idea没报错,但是编译后的class就是没有getxx,setxx方法
二、分析
1:检查lombok是否引入依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>最新版本号(例如:1.18.30)</version>
<scope>provided</scope>
</dependency>
2:IDE 配置问题
Lombok 是通过注解处理器动态生成代码的,因此需要确保 IDE 支持并启用了 Lombok。
IntelliJ IDEA:
- 打开 File -> Settings -> Plugins。
- 搜索 Lombok Plugin,确保插件已安装并启用。
- 在 File -> Settings -> Build, Execution, Deployment -> Compiler -> Annotation Processors 中,勾选 Enable annotation processing。
3:清理和重新构建项目
- mvn clean install
- 在 IntelliJ IDEA 中,点击 Build -> Rebuild Project。
4:检查编译器版本
如果你升级了 JDK 或者使用了较新的编译器版本,可能会导致兼容性问题。例如,JDK 16 及以上版本默认启用了更严格的模块化限制,可能会影响 Lombok 的工作。
5:检查是否有冲突的配置
如果你在项目中同时使用了其他代码生成工具(如 MapStruct、Immutables 等),可能会与 Lombok 发生冲突。检查是否存在类似的冲突,并尝试排除可能导致问题的依赖。
6:调试模式
如果上述方法都无法解决问题,可以尝试手动编写 getter 和 setter 方法,看看是否能正常工作。如果手动方法可以正常工作,说明问题确实出在 Lombok 上。
三、解决方案
经过上述分析,发现,就是MapStruct分析引起的。
1. 根本原因:注解处理器未正确配置
-
Lombok 和 MapStruct 都依赖注解处理器:
- Lombok 的
@Data
通过注解处理器生成代码(如getter
/setter
)。 - MapStruct 通过注解处理器生成 Mapper 实现类。
- Lombok 的
-
Maven 默认的注解处理器行为:
- Maven 默认会尝试自动发现并执行项目依赖中的注解处理器。
- 但某些情况下(如多注解处理器共存),Maven 可能无法正确识别所有处理器,导致 Lombok 的注解处理器被忽略。
-
修复方案:
- 通过显式配置
maven-compiler-plugin
的<annotationProcessorPaths>
,强制指定 Lombok 的注解处理器路径,确保其优先被调用。
- 通过显式配置
2. 处理方案
- 显式声明注解处理器路径:
<annotationProcessorPaths> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.30</version> </path> </annotationProcessorPaths>
- 这段配置明确告诉 Maven:优先使用指定的 Lombok 注解处理器,避免 MapStruct 或其他依赖干扰 Lombok 的处理流程。
- 确保 Lombok 的
@Data
在编译时被正确处理,生成getter
/setter
方法。
3. 更完整的解决方案
如果同时使用 MapStruct 和 Lombok,建议在插件中同时声明两者的注解处理器路径:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<annotationProcessorPaths>
<!-- Lombok 处理器 -->
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
</path>
<!-- MapStruct 处理器 -->
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.5.5.Final</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
4. 关键验证步骤
-
检查编译日志:
- 运行
mvn clean compile -X
,查看注解处理器的调用顺序,确保 Lombok 和 MapStruct 都被正确触发。
- 运行
-
IDE 配置:
- 在 IntelliJ IDEA 中,确保启用注解处理:
Settings > Build > Compiler > Annotation Processors > Enable annotation processing
。
- 在 IntelliJ IDEA 中,确保启用注解处理:
5. 总结
- 问题本质:Maven 默认的注解处理器发现机制无法正确处理多个处理器共存时的依赖关系。
- 解决方案:显式声明注解处理器路径,确保 Lombok 和 MapStruct 的处理器按预期顺序执行。
- 最佳实践:在复杂项目中,始终显式配置
maven-compiler-plugin
的注解处理器路径,避免隐式依赖导致的编译问题。