Lombok 1.18.x与 MapStruct Plus 的集成冲突。
这个冲突的核心在于编译期注解处理器的执行顺序:Lombok 先生成 getter/setter 等方法,MapStruct 需要依赖这些方法来生成映射代码。如果顺序错乱,MapStruct 就会因为“找不到方法”而编译失败。
这里有一个关键点:Lombok 1.18.16 是一个分水岭。从这个版本开始,集成方式发生了变化。
💡 解决方案:在pom.xml中配置注解处理器路径
最可靠的解决方案,是在项目的pom.xml文件中,通过maven-compiler-plugin插件的annotationProcessorPaths显式指定注解处理器的声明顺序和依赖。
关键是顺序,以下是推荐配置,Lombok 及其绑定工具必须在前:
xml
<properties> <lombok.version>1.18.36</lombok.version> <!-- 使用你实际的 Lombok 版本 --> <mapstruct-plus.version>1.4.8</mapstruct-plus.version> <!-- 使用你实际的 MapStruct Plus 版本 --> <lombok-mapstruct-binding.version>0.2.0</lombok-mapstruct-binding.version> </properties> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> <annotationProcessorPaths> <!-- 1️⃣ 必须最先声明 Lombok 自身 --> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> </path> <!-- 2️⃣ 为解决高版本 Lombok 兼容性问题,添加官方桥接器 --> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok-mapstruct-binding</artifactId> <version>${lombok-mapstruct-binding.version}</version> </path> <!-- 3️⃣ 最后声明 MapStruct Plus 处理器 --> <path> <groupId>io.github.linpeilie</groupId> <artifactId>mapstruct-plus-processor</artifactId> <version>${mapstruct-plus.version}</version> </path> </annotationProcessorPaths> </configuration> </plugin> </plugins> </build>🔧 其他关键排查步骤
如果配置后仍有问题,可以尝试以下步骤:
排除依赖冲突:MapStruct Plus 已经内嵌了 MapStruct。请检查并排除项目中其他依赖(如
springfox-swagger2)传递进来的org.mapstruct相关包,避免版本冲突。执行清理和重新编译:在项目根目录执行
mvn clean compile。检查 IDE 设置:确保你的 IDE(如 IDEA)已经开启了“注解处理器”(Annotation Processing)功能。
排查 Devtools 干扰:如果项目中引入了
spring-boot-devtools,可以尝试暂时移除,因为它会修改类加载器,有时会导致奇怪的问题。
💎 总结
解决 Lombok 与 MapStruct Plus 冲突的关键在于两点:
通过
annotationProcessorPaths强制规定执行顺序:确保 Lombok 处理器先执行。引入官方桥接器:对于
Lombok 1.18.16+,需要添加lombok-mapstruct-binding依赖来确保兼容性。
按照上述配置操作,应该能解决你遇到的冲突。