Lombok在Intellij IDEA下使用eclipse compiler时的问题及解决方法

Lombok + Eclipse Compiler

Project Lombok可以通过注解的方式自动在JavaBean中增加gettter/setter及构造方法,使用起来可以减少代码量,非常方便。在Intellij IDEA中使用的时候需要首先安装Lombok插件,并在项目中引入lombok.jar包。

不过当Java编译器选用Eclipse Compiler for Java (ECJ)(不是Eclipse IDE)的时候(如下图所示)会出现一些问题。ECJ相较于javac有更快的编译响应速度,同JRebel一起使用的时候非常方便,更多介绍可以参考这篇What is the difference between javac and the Eclipse compiler?文章。

找不到getXXX或setXXX方法

错误提示如下:

java: The method getXxx() is undefined for the type xxx

项目引入lombok包

如果是Maven项目的话,可以增加下面的依赖:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.16</version>
    <scope>provided</scope>
</dependency>

安装Lombok插件

确保已经成功安装了Lombok插件;
file

勾选Enable annotation processing

进入Preferences-Build, Executing, Deployment-Compiler-Annotation Processors下面将Enable annotation processing选项勾选:

设置javaagent(仅限于eclipse编译器,会跟javac编译器冲突)

-javaagent:后面一定是lombok.jar文件的绝对路径,Mac/Linux下面不支持使用~表示当前用户主目录,另外还需要注意路径中如果出现空格的话一定要用双引号将其包住,否则会出现Error opening zip file or JAR manifest missing的错误。

在Mac/Linux系统下可以使用ln命令创建一个软链接,如:

sudo ln -s ~/.m2/repository/org/projectlombok/lombok/1.18.16/lombok-1.18.16.jar /Library/lombok.jar

这样只要设定成 -javaagent:/Library/lombok.jar就可以了。

接下来有两种方法为编译器设置javaagent:

  • 方法一: 在Preferences-Build, Executing, Deployment-Compiler下面,设置Shared build process VM options:内如如下:

    -javaagent:/Library/lombok.jar -Djps.track.ap.dependencies=false

    file
    这里需要注意的是,设置好之后,最后对项目重新进行编译。

  • 方法二:修改shell的配置文件,如vim ~/.bash_profile,加入如下内容:

    export JAVA_TOOL_OPTIONS="-javaagent:/Library/lombok.jar -Djps.track.ap.dependencies=false"

    然后仔细source ~/.bash_profile将其生效,这样九设置了一个全局的javac配置项。需要重启一下Intellij IDEA才能生效。
    注意:此方法会改变系统全局的设置,可能会跟javac编译器冲突。

出现 cannot find symbol 错误

在使用JRebel运行mvn jetty:run的时候,会出现cannot find symbol编译错误,可以点击Build - Rebuild Project 菜单重新编译之后再运行就正常了,但是几乎每次重新启动的时候都要重新编译,可以在pom.xom文件中对maven-compiler-plugin进行如下设置:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <annotationProcessorPaths>
                    <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>${lombok.version}</version>
                    </path>
                </annotationProcessorPaths>
            </configuration>
        </plugin>
    <plugins>
</build>

记得定义lombok.version属性。

最后确保在Eclipse Options中勾选了Proceed on errors选项:
file

注意:此设置如果选择javac编译器,执行maven命令之前如果使用clean命令会出现运行错误。

出现 ClassFormatError

详细错误内容如下:

这个其实是lombok插件的一个bug作者承诺会在下个版本中解决,但在现在的0.34版本中还没有解决这个问题。

所幸有人在Jetbrains 社区中中提到了这个bug ,官方,已经在IDEA 2020.3及之后的版本解决了这个问题(IDEA-254725),可以先将IDEA升级到这个版本之后。

以上的方法都无法解决,请看这里

如果以上的方法依然无法解决你的问题,可以参考Lombok在IntelliJ IDEA下出现cannot find symbol问题的解决 这篇最新的文章。


参考资料:
Lombok annotations do not compile under Intellij idea [duplicate]
Can't compile project when I'm using Lombok under IntelliJ IDEA
“Error opening zip file or JAR manifest missing” when configuring javaagent in IntelliJ
Lombok + Eclipse compiler problem: "java.lang.ClassFormatError: Extra bytes at the end of class file"

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注