最近用 Idea 开发遇到很多问题,大部分问题都是编译相关设置有问题,这里总结一下。
--parameters
Spring Boot 的很多功能(比如构造器注入)都依赖于反射,而 JAVA 默认情况下将源码(.java)编译成字节码(.class)时会将方法的参数名抹去(变成类似 var1 var2 这样的命名)。因此需要在编译时指定-params
在 Idea 编译器相关设置中设置:
同时还需要在 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 语法级别):
这说明源码的 Java 语法版本是 21。
对应的,编译器相关设置里:
这说明编译后的字节码语言版本也是 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 的编译器>注解处理器
的设置就会发现:
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 的设置信息,就会更新为:
现在使用 Idea 编译项目就不会出现问题了。
The End.
文章评论