对于希望兼容旧版本Java(即1.8或以下)的项目,又想为Java 9项目提供module-info.java,必须知道他们需要调用javac两次:module-info。 java必须使用release=9编译,而其余源必须使用较低版本的source / target编译。
执行此操作的首选方法是使用 2 个执行块,如下所述。JDK 9 只支持对 Java 6 及以上版本的编译,因此想要兼容 Java 5 或以下版本的项目需要使用两个不同的 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.8.1</version> <executions> <execution> <id>default-compile</id> <configuration> <!-- compile everything to ensure module-info contains right entries --> <!-- required when JAVA_HOME is JDK 8 or below --> <jdkToolchain> <version>9</version> </jdkToolchain> <release>9</release> </configuration> </execution> <execution> <id>base-compile</id> <goals> <goal>compile</goal> </goals> <!-- recompile everything for target VM except the module-info.java --> <configuration> <excludes> <exclude>module-info.java</exclude> </excludes> </configuration> </execution> </executions> <!-- defaults for compile and testCompile --> <configuration> <!-- jdkToolchain required when JAVA_HOME is JDK 9 or above --> <jdkToolchain> <version>[1.5,9)</version> </jdkToolchain> <source>1.5</source> <target>1.5</target> </configuration> </plugin> </plugins> [...] </build> [...] </project>
如果您希望项目与 Java 6 兼容,最简单的方法是将 Java 9 用于两个执行块。您可以使用 maven-toolchain-plugin 指定共享 JDK(自 Maven 2.0.9 起支持)或自定义 jdkToolchain(自 Maven 3.3.1 起支持)并参考您系统上的 JDK 9 安装。或者通过设置JAVA_HOME=/path/to/jdk-9简单地使用 Java 9 作为 Maven 的运行时。
<project> [...] <build> [...] <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <executions> <execution> <id>default-compile</id> <configuration> <!-- compile everything to ensure module-info contains right entries --> <release>9</release> </configuration> </execution> <execution> <id>base-compile</id> <goals> <goal>compile</goal> </goals> <!-- recompile everything for target VM except the module-info.java --> <configuration> <excludes> <exclude>module-info.java</exclude> </excludes> </configuration> </execution> </executions> <!-- defaults for compile and testCompile --> <configuration> <!-- Only required when JAVA_HOME isn't at least Java 9 and when haven't configured the maven-toolchains-plugin --> <jdkToolchain> <version>9</version> </jdkToolchain> <release>6</release> </configuration> </plugin> </plugins> [...] </build> [...] </project>