如果我理解正确,Java 10 的二进制形式与 Java 9 100% 相同,所以它不应该有任何问题。
我的假设正确吗?
这与 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 9
and -target 9
,而且编译器还会阻止您使用 JDK 9 之后引入的功能。
javac
支持一个--release
论点有一段时间了。只要您不使用较新版本(在本例中为 Java 10)的功能,您就可以执行以下操作:
javac --release 9
一切都应该正常工作。更好的是,如果有需要解决的问题,Java 编译器会抱怨。
请注意,如果不这样做,UnsupportedClassVersionError
即使代码在技术上是有效的,您也会得到一个,因为所需的最低 Java 版本包含在已编译的字节码中,并且默认为 Java 编译器的当前版本。
现在,如果您想使用较新的 Java 语言功能,但还包括支持较旧 JVM 的代码,您也可以使用多版本jar 。