JDK version和class file version(Class编译版本号)对应关系解读
作者:lzhfdxhxm
JDK version和class file version(Class编译版本号)对应关系
JDK 19 = 63,
JDK 18 = 62,
JDK 17 = 61,
JDK 16 = 60,
JDK 15 = 59,
JDK 14 = 58,
JDK 13 = 57,
JDK 12 = 56,
JDK 11 = 55,
JDK 10 = 54,
JDK 9 = 53,
JDK 8 = 52,
JDK 7 = 51,
JDK 6.0 = 50,
JDK 5.0 = 49,
JDK 1.4 = 48,
JDK 1.3 = 47,
JDK 1.2 = 46,
JDK 1.1 = 45.0-45.6
可以使用下列的方式来查看
使用文本编辑器EmEditor等以16进制方式打开.class文件,
在魔数之后的就是次版本号和主版本号:
图中红框中的代表版本号52.0
- 次版本号:00 00 (小数点后面的部分)
- 主版本号:00 34 (小数点前面的部分)对应的10进制为52,对应的jdk版本为jdk8
各个版本的对应关系
JDK版本号 | Class版本号 | 16进制 |
---|---|---|
1.1 | 45.0 | 00 00 00 2D |
1.2 | 46.0 | 00 00 00 2E |
1.3 | 47.0 | 00 00 00 2F |
1.4 | 48.0 | 00 00 00 30 |
1.5 | 49.0 | 00 00 00 31 |
1.6 | 50.0 | 00 00 00 32 |
1.7 | 51.0 | 00 00 00 33 |
1.8 | 52.0 | 00 00 00 34 |
备注:
文件结构可以在JVM规范里查看,链接里是Java SE 19的版本 Chapter 4. The class File Format (oracle.com)
https://docs.oracle.com/javase/specs/jvms/se19/html/jvms-4.html#jvms-4.1
其它jdk版本的话,更改下链接里的se后的值就行。
jar包对不同JDK版本的兼容性问题:Unsupported major.minor version 52.0
Unsupported major.minor version 52.0 这类错误是因为Java版本不一致造成的,在高版本的JDK(1.8)环境中编译JAR包,然后JAR在低版本的JVM(1.6)中运行
The issue is because of Java version mismatch. Referring to the Wikipedia Java Class Reference :
- J2SE 8 = 52
- J2SE 7 = 51
- J2SE 6.0 = 50
- J2SE 5.0 = 49
- JDK 1.4 = 48
- JDK 1.3 = 47
- JDK 1.2 = 46
- JDK 1.1 = 45
These are the reported major numbers. The error regarding the unsupported major.minor version is because during compile time you are using a higher JDK and a lower JDK during runtime.
解决的方法
那么现在如果碰到这种问题该知道如何解决了吧,还会像我所见到有些兄弟那样,去找个 1.4 的 JDK 下载安装,然后用其重新编译所有的代码吗?
其实大可不必如此费神,我们一定还记得 javac 还有个 -target 参数,对啦,可以继续使用 1.5 JDK,编译时带上参数 -target 1.4 -source 1.4 就 OK 啦,不过你一定要对哪些 API 是 1.5 JDK 加入进来的了如指掌,不然你的 class 文件拿到 JVM 1.4 下就会 method not found。
目标 JVM 是 1.3 的话,编译选项就用 -target 1.3 -source 1.3 了。
其实这种方式挺不方便,因为你下载的Eclipse工具有可能不支持低版本的JSK
所以,最简单方式还是对 Eclipse 的项目属性的设置(项目右键 -> properties -> Java Compiler, 设置"Compeler compliance settings"为1.6),如图
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。