📜  已由更新版本的 Java Runtime(类文件版本)编译,此版本的 Java Runtime 仅识别最高版本的类文件 - Java (1)

📅  最后修改于: 2023-12-03 15:25:24.975000             🧑  作者: Mango

已由更新版本的 Java Runtime(类文件版本)编译,此版本的 Java Runtime 仅识别最高版本的类文件 - Java

简介

Java Runtime是Java虚拟机的一部分,用于运行Java程序。Java程序通常以Java字节码的形式编译后传递给Java Runtime执行。但不同版本的Java Runtime只能识别和执行特定版本的Java字节码。

本文将讨论Java Runtime中类文件版本的问题。如果你在开发Java程序时遇到了“已由更新版本的 Java Runtime(类文件版本)编译,此版本的 Java Runtime 仅识别最高版本的类文件”的错误,那么本文将对你有所帮助。

Java类文件版本

Java字节码格式是Java程序的中间表示形式,也是Java平台跨平台的基础。Java编译器将Java源代码编译成Java字节码,然后由Java Runtime执行。

Java字节码由多个类文件构成,每个类文件对应于一个类。每个类文件都有一个版本号,它指定了该类文件所对应的Java版本号。Java Runtime只能执行与其版本兼容的Java字节码。

Java类文件版本的格式如下:

major_version.minor_version

其中,major_version和minor_version都是无符号整数。Java的版本号与类文件版本号之间的关系如下表:

| Java版本号 | 类文件版本号 | | ---------- | ------------ | | 1.1 | 45.0 | | 1.2 | 46.0 | | 1.3 | 47.0 | | 1.4 | 48.0 | | 5.0 | 49.0 | | 6 | 50.0 | | 7 | 51.0 | | 8 | 52.0 | | 9 | 53.0 | | 10 | 54.0 | | 11 | 55.0 | | 12 | 56.0 | | 13 | 57.0 | | 14 | 58.0 | | 15 | 59.0 |

已由更新版本的 Java Runtime(类文件版本)编译,此版本的 Java Runtime 仅识别最高版本的类文件

当你在Java 11以上的环境中编译Java代码时,默认情况下编译器会将类文件版本设置为59.0(即使用Java 15的类文件格式)。

如果你将编译后的Java程序运行在Java 10或以下的环境中,会出现以下错误:

java.lang.UnsupportedClassVersionError: Unsupported classfile major version 59

这是因为Java 10或以下的Java Runtime只能识别与其版本相兼容的类文件(即最高只能识别52.0的类文件)。

如果你需要将Java程序运行在Java 10或以下的环境中,那么你需要在编译Java代码时指定类文件版本号。比如,你可以使用以下命令将类文件版本设置为52.0:

javac -source 15 -target 11 -bootclasspath <path-to-java-10> <source-file>.java

其中,-source表示Java源代码的版本(15),-target表示编译后的Java字节码版本(11),-bootclasspath表示Java 10的运行库路径。

总结

本文介绍了Java Runtime中类文件版本的问题,以及当你在Java 11以上的环境中编译Java代码时可能出现的错误。如果你需要将Java程序运行在Java 10或以下的环境中,那么你需要在编译Java代码时指定类文件版本号。