pom.xml 中配置的 java.version 到底有什么用?
Maven 项目
对于使用 Maven 脚手架直接创建的项目(或模块),如果在 pom.xml 中只配置了 java.version:
<properties>
<java.version>1.8</java.version>
</properties>
我们最常碰到的问题就是编译错误:
Error:(109,32) java: -source 1.5 中不支持 diamond 运算符
SpringBoot 项目
对于使用 SpringBoot 创建的项目(或模块),我们在 pom.xml 中配置 java.version 参数后,项目(或模块)即可以按照我们指定的 java 版本进行编译。那么,java.version 参数怎么起作用的?
我们在pom.xml中找到 parent 元素:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
打开 parent 能看到 properties 元素:
<properties>
<java.version>1.8</java.version>
<resource.delimiter>@</resource.delimiter>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
可以看到 java.version 被 maven.compiler.source 和 maven.compiler.target 元素引用,以指定编译时源文件(.java)和目标文件(.class)的 java 版本。
问题的结论
- 第一,java.version 并非 Maven 官方定义的参数,而是 SpringBoot 官方定义的参数;
- 第二,java.version 被用于指定编译时源文件和目标文件的 java 版本。
据此,对于使用 Maven 脚手架创建的项目(或模块),建议在 pom.xml 中配置如下:
<properties>
<java.version>1.8</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
</properties>