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 编译器版本:

  1. 通过 Maven Java compiler 属性
  2. 通过 Maven Java compiler 插件

这两种在 Maven 中设置 Java 编译器版本的方法会在如下小节中解释。

通过 Maven Java 编译器属性设置 Java 编译器版本

首先,在 Maven POM 文件中设置 Java 编译器版本的最新和最简单的方法就是通过 Maven Java 编译器属性。如下是 Maven Java 编译器属性的样子:

  1. <properties>
  2. <maven.compiler.target>1.8</maven.compiler.target>
  3. <maven.compiler.source>1.8</maven.compiler.source>
  4. </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 属性,而不是 sourcetarget 属性。如下是 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>