1. 概述
在本篇简短教程中,我们将介绍如何在 Maven 中设置 Java 版本。
在继续之前,我们可以 查看 Maven 默认使用的 JDK 版本。执行 mvn -v 命令会显示 Maven 运行时所使用的 Java 版本。
2. 使用 Compiler 插件
我们可以在 编译器插件 中指定所需的 Java 版本。
2.1. Compiler 插件
第一种做法是在编译器插件相关属性中设置版本:
<properties>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>1.8</maven.compiler.source>
</properties>
Maven 编译器对应命令行中的 -target 与 -source 版本。若要使用 Java 8 的语言特性,-source 应设为 1.8。
此外,为使编译后的类文件与 JVM 1.8 兼容,-target 也应设为 1.8。
二者的默认值均为 1.6。
也可以直接配置编译器插件:
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
maven-compiler-plugin 还提供其他配置项,使我们能在 -source 与 -target 之外对编译过程做更细的控制。
2.2. Java 9 及更高版本
此外,从 JDK 9 起可以使用新的 -release 命令行选项。该参数会自动将编译器配置为生成与指定平台版本实现相链接的 class 文件。
默认情况下,仅使用 -source 与 -target 并不能保证跨版本编译(cross-compilation)正确。
这意味着我们无法保证应用能在更旧的平台版本上运行。此外,要为更旧的 Java 版本编译并运行程序,通常还需要指定 -bootclasspath。
若要正确跨版本编译,新的 -release 选项会一并替代三个标志:-source、-target 与 -bootclasspath。
将前面的示例改写后,可在插件属性中这样声明:
<properties>
<maven.compiler.release>17</maven.compiler.release>
</properties>
对于从 3.6 版起的 maven-compiler-plugin,还可以这样写:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.12.1</version>
<configuration>
<release>7</release>
</configuration>
</plugin>
注意:我们可以通过新的 <release> 元素指定 Java 版本。 本例中,我们将应用编译为面向 Java 7。
而且,本机不必安装 JDK 7;Java 17 已包含将新语言特性与 JDK 7 进行链接所需的全部信息。
3. Spring Boot 的约定
Spring Boot 应用在 pom.xml 的 properties 中指定 JDK 版本。
首先,需要将 spring-boot-starter-parent 作为项目的父 POM:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
</parent>
该父 POM 会为我们配置默认插件及多项属性,其中包括 Java 版本——默认一般为 1.8。
不过,可以通过 java.version 属性覆盖父 POM 的默认版本:
<properties>
<java.version>17</java.version>
</properties>
通过设置 java.version 属性,我们声明源码与目标 Java 版本与所配置的值一致(上例为 17)。
务必记住:该属性属于 Spring Boot 的约定。此外,从 Spring Boot 2.0 起,最低要求为 Java 8。
这意味着无法在更旧的 JDK 上使用或配置 Spring Boot。
4. 小结
本篇简短教程说明了在 Maven 项目中设置 Java 版本的常见方式。
要点归纳如下:
- 仅在使用 Spring Boot 时才能使用
<java.version>。 - 简单场景下,使用
maven.compiler.source与maven.compiler.target属性通常最合适。 - 若要对编译过程做更细控制,请使用
maven-compiler-plugin的<configuration>配置。