其他答案中的“简单建议”将无法正常工作,因为不幸的是情况并不简单。编译器选项的含义略有不同。这maven.compiler.source
and maven.compiler.target
options分别指的是源代码格式和生成的class文件的格式。但他们确实not考虑 API 更改:maven.compiler.release
does.
所以如果你盲目地使用<maven.compiler.source>8</maven.compiler.source>
and <maven.compiler.target>8</maven.compiler.target>
,例如,如果您使用 Java 11 进行构建,则生成的类文件将支持 Java 8,但 API 可能仍依赖于 Java 11 更改,并在 Java 8 上运行时中断。请参阅javac 11 应如何将更高版本中重写的方法与 Java 8 目标链接起来? https://stackoverflow.com/q/64868952进行更多讨论。
如果您想指定 Java 8 但基于 Java 9+ 构建,那么解决方案就不那么简单了。您需要使用 Java 8 支持的编译器选项来指定源和目标:
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
然后您需要在中设置一个单独的配置文件<profiles>
仅在 Java 9+ 中激活以打开maven.compiler.release
option:
<profile>
<id>java-8-api</id>
<activation>
<jdk>[9,)</jdk>
</activation>
<properties>
<maven.compiler.release>8</maven.compiler.release>
</properties>
</profile>
这样,如果您基于 Java 9+ 进行构建,maven.compiler.release
将生效并限制 API 与 Java 8 兼容。如果您在 Java 8 上构建,则其他两个选项会将源代码和类文件格式设置为 Java 8,并且 API 根据定义将与 Java 8 兼容。
对于所有相关人员来说,更好的选择当然是尽快迁移到 Java 11。