5

如果我理解正确,Java 10 的二进制形式与 Java 9 100% 相同,所以它不应该有任何问题。

我的假设正确吗?

4

2 回答 2

17

这与 Java 10 无关;规则与以往一样。

在每个 Java 版本中,类文件版本号都增加了。您可以在较新的 Java 运行时上运行较旧的类文件(您可以在 Java 10 上运行二十年前在 Java 1.0 下编译的文件!),但您可以在较旧的运行时上运行较新的类文件从来都不是真的。Java 10 并没有改变这一点。

但是,如果您不使用自该版本以来引入的新功能,您可以编译类以使其在旧版本上运行。这曾经由-source-target开关完成:

// Run this on Java 8
javac -source 6 -target 6 Foo.java

您将获得可在 Java 6 及更高版本上运行的类文件。(源版本不能大于目标版本。)最近替换为更全面的--release选项:

javac --release 9

这不仅意味着-source 9and -target 9,而且编译器还会阻止您使用 JDK 9 之后引入的功能。

于 2018-03-20T14:42:10.837 回答
7

javac支持一个--release论点有一段时间了。只要您不使用较新版本(在本例中为 Java 10)的功能,您就可以执行以下操作:

javac --release 9

一切都应该正常工作。更好的是,如果有需要解决的问题,Java 编译器会抱怨。

请注意,如果不这样做,UnsupportedClassVersionError即使代码在技术上是有效的,您也会得到一个,因为所需的最低 Java 版本包含在已编译的字节码中,并且默认为 Java 编译器的当前版本。

现在,如果您想使用较新的 Java 语言功能,但还包括支持较旧 JVM 的代码,您也可以使用多版本jar 。

于 2018-03-20T03:50:27.543 回答