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

ARX*_*ARX 0 java ant javac preview-feature java-16

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

使用 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)

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

Arv*_*ash 5

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

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

javac --enable-preview --release 16 MyClass.java
Run Code Online (Sandbox Code Playgroud)

但是,record这是 Java-16 中的标准功能,因此您不需要使用--enable-preview参数编译代码。您可以在不使用此参数的情况下编译代码,即

javac MyClass.java
Run Code Online (Sandbox Code Playgroud)

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

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

java --enable-preview MyClass
Run Code Online (Sandbox Code Playgroud)

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

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

  • 顺便说一句,Java 16 在其第二个预览版中提供了 [*密封类*](https://openjdk.java.net/jeps/397) 功能。因此,如果您想尝试该功能,则需要启用预览模式,如此正确答案中所述,但适用于 Java 16 而不是 Java 15。 (4认同)