今天编译时遇到一个错误unsupported major.minor version50.0,看到这个错误的时候, 我首先想到了是java编译器版本的问题,因为我PC默认的JDK是1.7,但是在Eclipse里面默认的是1.6,当我调整了JDK的版本后,这个问题就解决了。
回到问题的本身,major和minor是什么呢?Google一下可以得到很多信息,它实际上是软件的主次版本号,51是主版本号,0是次版本号。怎么能查看到它的版本号呢?java实际也提供了这个命令,javap.
javap -verboase xxx.class
就可以得到这个class文件的一些相关信息,就可以清楚地看到major和minor的值。查看oracle的官网,有更多的javap命令的解释,http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javap.html
在网上找到一个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 |
可以看出,JDK1.7对应的版本号是50,JDK1.6对应的版本号是49. 低版本的JDK编译的class是可以在高版本的虚拟机上运行的,但是高版本的JDK编译的class是不能再低版本的虚拟机上运行的。
如果我们碰到类似的问题,是否也需要下载一个低版本的JDK来重新编译一次呢?其实java早就帮我们考虑到了这一点,我们在编译的时候可以指明我们要使用哪个版本的JDK,如
javac -target 1.6 **.java
但是有一点事需要注意的,如果你的java文件使用到的是1.7新增的一些feature,再指定到1.6编译,肯定是不行的。