IDEA 中使用 Lombok 插件突然失效

1,460 阅读2分钟

起因

在开发 Hot Key IM项目起步阶段用户进行登录注册之后,需要返回 UserVO 对象,该对象由UserUserInfo 两个POJO 对象聚合而来,未了避免使用 BeanUtils 这种浅拷贝工具,因为其原理是通过放射方式拷贝,效率低下,并且不安全,所以接入 mapstruct 工具。

此时在掘金找了一篇起步教程,导入依赖:

<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
    <version>${org.mapstruct.version}</version>
</dependency>

之后,配置了 maven plugin:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.5.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
                <annotationProcessorPaths>
                    <path>
                        <groupId>org.mapstruct</groupId>
                        <artifactId>mapstruct-processor</artifactId>
                        <version>${org.mapstruct.version}</version>
                    </path>
                </annotationProcessorPaths>
            </configuration>
        </plugin>
    </plugins>
</build>

错误

添加完 plugin 后就写完代码允许,结果完美出错,Lombok 所有注解失效了,一大堆 getter ,setter 找不到

解决过程

因为以前遇到过类似的错误,所以直接Google 搜索了 Lombok 注解失效 ,找到的全部解决方法如下:

  • 确认真的在项目中成功导入了 lombok 依赖:通过查看 dependencies tree 列表是否真的导入了lombok, 如果没有导入请导入后重试
  • 导入的 lombok 是否版本正确:是否本身该版本就是有问题的;是否和工程的 Spring ,Spring Boot 环境版本想兼容或匹配,如果可以请尝试升级 lombok 版本
  • IDEA是否下载并且启用 Lombok 插件,IDEA 是否开启了注解处理器: Annotation Processor, 如果没有下载请下载并启用,如果启用了,请检查 File -> Setting -> Compiler -> Enable Annotation Processor 开启

除此之外在没有找到更多的答案了。 但是这些都不能解决我的问题,在这时想起了以前 使用 Gradle 工程的时候使用 lombok 需要单独再配置lombok 的 Annotation Processor,这时便想起来,我在 pom.xml 文件中指定了使用 mapstruct-processor 的注解处理器,是不是就相当于覆盖了Lombok 的注解处理器?

抱着试一试的态度,我去除了 上面引入的 mapstrucrt 的<plugin>您猜怎么着, 可以了lombok注解生效了 问题的关键就是这里了。

解决方法

在导入 mapstruct 依赖的时候看到提示有两个 mapstruct 相关的依赖,而且根据刚刚导入的 plugin 的内容应该就是需要寻找者processor处理器

image.png

心想要不试试这个依赖,接下来果断去除 mapstruct 的plugin ,然后导入此依赖

<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-processor</artifactId>
</dependency>

刷新,启动,查看 class path 类文件输出,此时可以看到已经有了 lombok 生成的 方法,并且 mapstruct 类也是生效的。

总结

请不用使用plugin,而是直接导入两个相关依赖就行,在需要使用mapstruct 的模块导入两个依赖即可

    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
</dependency>
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-processor</artifactId>
</dependency>