1.为什么要需要查看Class版本?
有一次在升级一个老项目的时候,更新某个class文件时运行报错,经过排查发现跟项目原先编译的版本不一致线上jdk是1.7而我自己的jdk是1.8编译环境,这里记录一下是如何排查发现编译版本不一致的问题。
2.排查步骤
- 用jdk自带命令 javap
javap -v 文件路径/xx.class
uages.class
Last modified 2018-5-6; size 969 bytes
MD5 checksum 2c6fca6e3d23143f42b1e61c1c02e017
Compiled from "xx.java"
public class xx.xx.xx.xx.xx
minor version: 0
major version: 50
flags: ACC_PUBLIC, ACC_SUPER
.......
上面的minor version: 0和major version: 50就是编译xx.class时使用的jdk编译版本号。
但是它并不是我们所熟悉的jdk版本号(比如jdk1.5)。
不过我们可以把从 JDK 1.1 到 JDK 1.7 编译器编译出的 class 的默认 minor.major version 汇总下就知道对应关系了。
- jdk编译版本
JDK编译器版本 | target 参数 | 十六进制 minor.major | 十进制 minor.major |
---|---|---|---|
jdk1.1.8 | 不能带 target 参数 | 00 03 00 2D | 45.3 |
jdk1.2.2 | 不带(默认为 -target 1.1) | 00 03 00 2D | 45.3 |
jdk1.2.2 | -target 1.2 | 00 00 00 2E | 46.0 |
jdk1.3.1_19 | 不带(默认为 -target 1.1) | 00 03 00 2D | 45.3 |
jdk1.3.1_19 | -target 1.3 | 00 00 00 2F | 47.0 |
j2sdk1.4.2_10 | 不带(默认为 -target 1.2) | 00 00 00 2E | 46.0 |
j2sdk1.4.2_10 | -target 1.4 | 00 00 00 30 | 48.0 |
jdk1.5.0_11 | 不带(默认为 -target 1.5) | 00 00 00 31 | 49.0 |
jdk1.5.0_11 | -target 1.4 -source 1.4 | 00 00 00 30 | 48.0 |
jdk1.6.0_01 | 不带(默认为 -target 1.6) | 00 00 00 32 | 50.0 |
jdk1.6.0_01 | -target 1.5 | 00 00 00 31 | 49.0 |
jdk1.6.0_01 | -target 1.4 -source 1.4 | 00 00 00 30 | 48.0 |
jdk1.7.0 | 不带(默认为 -target 1.6) | 00 00 00 32 | 50.0 |
jdk1.7.0 | -target 1.7 | 00 00 00 33 | 51.0 |
jdk1.7.0 | -target 1.4 -source 1.4 | 00 00 00 30 | 48.0 |
Apache Harmony 5.0M3 | 不带(默认为 -target 1.2) | 00 00 00 2E | 46.0 |
Apache Harmony 5.0M3 | -target 1.4 | 00 00 00 30 | 48.0 |
赏
使用支付宝打赏
使用微信打赏
若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏
扫描二维码,分享此文章