Maven 所用的默认 Java 编译器版本是 Java 1.5。我们知道 Java 5 是 2004 年就发布了,那么为什么它依然是默认的 Java 编译器版本呢?这是个好问题。为了让 Maven 用更新版本的 Java 编译器编译 Java 代码,我们需要在项目的 POM 文件中显式指定 Java 编译器。
具体如何指定 Java 编译器版本,取决于用的是 Java 8 或者更早版本,还是 Java 9 或更高版本。从 Java 9 开始,Java 有了模块,在短期内会使编译变得有些复杂,不过从长远来看,应该会有所帮助。
Java 8 及更早版本的 Maven Java 编译器
从 Java 8 以及更早版本开始,就有两种方式可以在 Maven POM 文件中设置 Java 编译器版本:
- 通过 Maven Java compiler 属性
- 通过 Maven Java compiler 插件
这两种在 Maven 中设置 Java 编译器版本的方法会在如下小节中解释。
通过 Maven Java 编译器属性设置 Java 编译器版本
首先,在 Maven POM 文件中设置 Java 编译器版本的最新和最简单的方法就是通过 Maven Java 编译器属性。如下是 Maven Java 编译器属性的样子:
<properties>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>1.8</maven.compiler.source>
</properties>
这些属性必须包含在 POM 文件的 properties
元素中,properties
元素通常是 POM 文件中的最后一个元素。
通过 Maven Java 编译器插件设置 Java 编译器版本
在 Maven POM 文件中设置 Java 编译器版本的第二种方式,也是最老的、最啰嗦的方式,是通过 Maven Java 编译器插件。如下是 Maven Java 编译器插件的配置示例:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
带有 Java 编译器版本设置的完整 Maven POM 文件
为方便起见,这里有一个使用两种上述机制设置 Java 编译器版本的完整 Maven POM 文件。请注意,POM 文件中只能用其中一种机制。这个示例只是显示了这两个示例,这样就可以看到它们在 POM 文件中的位置。
<project
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd"
>
<modelVersion>4.0.0</modelVersion>
<groupId>com.nanosai</groupId>
<artifactId>grid-ops</artifactId>
<version>0.8.0</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
<properties>
<project.build.sourceEncoding>
UTF-8
</project.build.sourceEncoding>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>1.8</maven.compiler.source>
</properties>
</project>
Java 9 及以上版本的 Maven Java 编译器
对于 Java 9 及以上版本,需要使用 Java 编译器插件的一个小变体。我们需要使用 release
属性,而不是 source
和 target
属性。如下是 Maven Java 编译器插件在使用 release
属性时的样子:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>11</release>
</configuration>
</plugin>
这个示例在 release
属性内设置 Java 版本为 11。Java 11 是本文编写时 Java 的最新的长期支持版(LTS)。
还请注意,Maven Java 编译器插件的版本从 3.6.1 变为 3.8.0 了。
请记住,当升级到 Java 9+ 时,很可能会遇到更多问题,比如要确保 Java 项目所使用的所有 Maven 插件和依赖也与 Java 9+ 兼容。不过,详细介绍如何实现这一点超出了本教程的范围。
启用预览功能
有些后来的 Java 版本(至少是 Java 10、12 和 13)已经有了一些预览版的特性。预览版中的特性是 Java SDK 团队已经实现了,但是还不能确定是否应该长期留在 Java SDK 中的特性。这些特性默认在 Java SDK 中是不启用的。如果要使用它们,就必须显式启用。要在 Maven POM 文件中启用 Java 预览版特性,请像如下所示那样,把 compilerArgs
元素插入到编译器配置中:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>11</release>
<compilerArgs>--enable-preview</compilerArgs>
</configuration>
</plugin>