想要兼容旧版 Java(即 1.8 或以下字节码和 API)的项目,但也想提供一个module-info.java用于 Java 9+ 运行时,必须知道他们需要调用javac两次:
执行此操作的首选方法是使用 2 个执行块,如下所述:
请注意,此外,JDK 9 仅支持 Java 6 及更高版本的编译,因此希望与 Java 5 或更低版本兼容的项目需要使用两个不同的 JDK 进行 2 次执行。使用工具链配置,即使稍微复杂一点,也很容易实现这一点。
如果您希望项目与 Java 6、7 或 8 兼容,您可以简单地将 JDK 9 用于两个执行块。
最简单的方法是使用 Java 9 作为 Maven 的运行时,方法是在运行mvn之前设置JAVA_HOME=/path/to/jdk-9。但是,如果您想为 Maven 使用较旧的 Java 运行时,您可以使用 maven-toolchain-plugin 指定共享 JDK(自 Maven 2.0.9 起支持)或自定义 jdkToolchain(自 Maven 3.3.1 起支持)并参考在您的系统上安装 JDK 9。
<project>
[...]
<build>
[...]
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<executions>
<execution>
<id>default-compile</id>
<configuration>
<release>9</release>
<!-- no excludes: compile everything to ensure module-info contains right entries -->
</configuration>
</execution>
<execution>
<id>base-compile</id>
<goals>
<goal>compile</goal>
</goals>
<configuration>
<!-- recompile everything for target VM except the module-info.java -->
<excludes>
<exclude>module-info.java</exclude>
</excludes>
</configuration>
</execution>
</executions>
<!-- defaults for compile and testCompile -->
<configuration>
<release>6</release><!-- or 7 or 8 depending on compatibility expectations -->
<!-- Only required when Maven runtime JAVA_HOME isn't at least Java 9 and when haven't configured the maven-toolchains-plugin -->
<jdkToolchain>
<version>9</version>
</jdkToolchain>
</configuration>
</plugin>
</plugins>
[...]
</build>
[...]
</project>鉴于 Maven 3 在运行时需要更新的 Java 版本,您绝对需要使用工具链来使用与 Maven 运行时不同的 JDK。
请注意,您至少需要 Maven 3.3.1 才能在插件配置中指定自定义 jdkToolchain。您可以添加一个 jdkToolchain 来执行基本编译执行块以及参考 JDK 5。
<project>
[...]
<build>
[...]
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<executions>
<execution>
<id>default-compile</id>
<configuration>
<release>9</release>
<!-- no excludes: compile everything to ensure module-info contains right entries -->
<!-- toolchain required when JAVA_HOME is JDK 8 or below -->
<jdkToolchain>
<version>9</version>
</jdkToolchain>
</configuration>
</execution>
<execution>
<id>base-compile</id>
<goals>
<goal>compile</goal>
</goals>
<configuration>
<!-- recompile everything for target VM except the module-info.java -->
<excludes>
<exclude>module-info.java</exclude>
</excludes>
</configuration>
</execution>
</executions>
<!-- defaults for compile and testCompile -->
<configuration>
<source>1.5</source>
<target>1.5</target>
<!-- jdkToolchain required when JAVA_HOME is JDK 9 or above -->
<jdkToolchain>
<version>[1.5,9)</version>
</jdkToolchain>
</configuration>
</plugin>
</plugins>
[...]
</build>
[...]
</project>