红茶的个人站点

  • 首页
  • 专栏
  • 开发工具
  • 其它
  • 隐私政策
Awalon
Talk is cheap,show me the code.
  1. 首页
  2. 开发工具
  3. 正文

DEBUG:Idea 编译出错

2025年5月22日 12点热度 0人点赞 0条评论

最近用 Idea 开发遇到很多问题,大部分问题都是编译相关设置有问题,这里总结一下。

--parameters

Spring Boot 的很多功能(比如构造器注入)都依赖于反射,而 JAVA 默认情况下将源码(.java)编译成字节码(.class)时会将方法的参数名抹去(变成类似 var1 var2 这样的命名)。因此需要在编译时指定-params参数,该参数可以让编译后的字节码保留方法参数列表中的参数名称。

在 Idea 编译器相关设置中设置:

image-20250522194544006

同时还需要在 POM 文件中 Maven 编译插件的部分添加同样的设置:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <annotationProcessorPaths>
                    <!-- ... -->
                    <compilerArgs>
                        <arg>-parameters</arg>
                    </compilerArgs>
                </annotationProcessorPaths>
            </configuration>
        </plugin>
    </plugins>
</build>

语法级别

其次,要保证开发环境所有环节的 Java 版本一致。

比如我这里使用的 JDK 是 22,Java 语法级别是 21(JDK 的版本要高于 Java 语法级别):

image-20250522195155887

这说明源码的 Java 语法版本是 21。

对应的,编译器相关设置里:

image-20250522195349212

这说明编译后的字节码语言版本也是 21。

对应的,在 POM 文件中,定义的语言级别也是 21:

<properties>
    <java.version>21</java.version>
</properties>

POM 编译插件中的源码级别和字节码级别也是:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <annotationProcessorPaths>
            <source>${java.version}</source>
            <target>${java.version}</target>
            <!-- ... -->
        </annotationProcessorPaths>
    </configuration>
</plugin>

Lombok

如果你用的是比较新的 JDK 版本和 SpringBoot,大概率会在使用 Lombok 时遇到一些问题。相关问题我这里有写。实际上大部分问题都是 Idea 和 Maven 的设置问题。

Lombok 旧版本结合比较新的 JDK 会出现一些 BUG,所以你必须使用最新版本的 Lombok 而非 SpringBoot 自带的:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>${lombok.version}</version>
    <scope>provided</scope>
</dependency>

我这里的${lomok.version}属性值是1.18.38。

这样做会导致一个奇怪的问题,在编码阶段是 OK 的,但在编译时候会遇到问题,找不到 Lombok 自动生成的方法等。原因是默认的 SpringBoot 生成的 POM 文件中定义的 Maven 编译插件使用的是无版本号的 Lombok:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <annotationProcessorPaths>
            <!-- ... -->
            <path>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
            </path>
        </annotationProcessorPaths>
    </configuration>
</plugin>

如果通过 Maven 编译项目(mvn:compile),这么做不会有问题。但如果是用 Idea 编译(或启动)项目,就会出现之前说到的问题,查看 Idea 的编译器>注解处理器的设置就会发现:

image-20250522201112572

Idea 会从 POM 文件的设置中读取 Maven 编译插件的设置,并从中获取 Lombok 包作为注解处理器。不过因为前面说的,默认是不带版本号的,所以这里 Idea 指向的是 lombok-unknow 这个包,显然这个包是 SpringBoot 默认使用的低版本 Lombok,所以会存在 Bug。

因此,要同样指定 Maven 编译插件使用最新版 Lombok 来处理注解:

<path>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>${lombok.version}</version>
</path>

再查看 Idea 的设置信息,就会更新为:

image-20250522201603382

现在使用 Idea 编译项目就不会出现问题了。

The End.

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: IDEA lombok 编译
最后更新:2025年5月22日

魔芋红茶

加一点PHP,加一点Go,加一点Python......

点赞
< 上一篇

文章评论

取消回复

*

code

COPYRIGHT © 2021 icexmoon.cn. ALL RIGHTS RESERVED.
本网站由提供CDN加速/云存储服务

Theme Kratos Made By Seaton Jiang

宁ICP备2021001508号

宁公网安备64040202000141号