如何在 Java 16 中删除 --enable-preview?

问题描述

为了在 JDK 15 中使用记录,我曾经在 Ant 构建中使用传递给 javac 的参数 --enable-preview --release 15 进行编译。一切都已编译并运行良好。

使用 JDK 16 时,如果我使用相同的参数进行编译,则会得到

错误:使用 --enable-preview 的无效源版本 15(预览 语言功能支持 16 版)

记录是 JDK 16 的标准特性,所以我希望我应该在没有这些参数的情况下进行编译。但是,如果我删除它们,我会得到

Foo.class 使用 Java SE 15 的预览功能。(使用 --enable-preview 允许加载包含预览功能的类文件

并且 Ant 报告编译失败:

编译失败;有关详细信息,请参阅编译器错误输出。在 org.apache.tools.ant.taskdefs.Javac.compile(Javac.java:1425)

因此,无论有没有标志,都会导致编译失败。怎么了?

解决方法

错误:使用 --enable-preview 的无效源版本 15(预览 语言功能仅支持 16 版)

由于您使用的是 JDK-16,因此您必须使用 16 作为 --release 的值(通常用于 JDK-16 中作为预览功能提供的任何功能)。因此,以下内容对您有用:

javac --enable-preview --release 16 MyClass.java

然而,record 是 Java-16 中的标准特性,因此您无需使用 --enable-preview 参数编译代码。您可以在不使用此参数的情况下编译代码,即

javac MyClass.java

Foo.class 使用 Java SE 15 的预览功能。(使用 --enable-preview 允许加载包含预览功能的类文件)

这不是编译时错误。当您尝试直接运行使用 --enable-preview 参数编译的 .java 类时,您会得到它。你可以运行它

java --enable-preview MyClass

编译失败;有关详细信息,请参阅编译器错误输出。在 org.apache.tools.ant.taskdefs.Javac.compile(Javac.java:1425)

您需要更新 JAVA_HOME 设置以指向 JDK-16,以便 ant 使用 JDK-16。