一、UnSupportedClassVersionError异常产生的根源
有时我们的代码在运行时,会抛出java.lang.UnSupportedClassVersionError异常。这个异常是java.lang.ClassFormatError(此类是java.lang.LinkageError)的子类。JVM在将一个class调入时候,在link阶段会检查class文件中的magic number,如果发现该magic number不在JVM所支持范围之内,就会扔出java.lang.UnSupportedClassVersionError异常。
当我们将java源代码文件编译成class文件的时候,class文件头部会有一个magic number,这个magic number即class文件的版本号码。通常的格式是:major_version.minor_version。这个号码暗示了class文件的格式。
通常来讲,使用高版本的jdk编译出来的class,运行在低版本的jdk环境上会出现此种错误。例如,使用JDK1.5编译出来的class运行在JDK 1.4上会报出这样的错误信息:
"java.lang.UnsupportedClassVersionError: Bad version number in .class file [at java.lang.ClassLoader.defineClass1(Native Method)]"
注意反之并不一定成立,即低版本JDK编译出来的class可以没有问题的运行在高版本的JDK上。
二、解决UnSupportedClassVersionError异常
1、到处问题的jar档,找到其源代码使用高版本的JDK重新编译;
2、升级JDK的版本试试看
三、编译Java代码
当我们使用javac编译源代码的时,有2个参数-source , -target。其中-source用来指定java语言的版本,-target用来指定class文件的版本。下面显示了各不同版本的JDK所支持的source版本和target版本。
JDK | 默认的source | source的范围 | 默认的target | target的范围 |
1.0.x | 1.0 | -- | 1.1 | -- |
1.1.x | 1.1 | -- | 1.1 | -- |
1.2.x | 1.2 | -- | 1.1 | 1.1 -- 1.2 |
1.3.x | 1.2/1.3 | -- | 1.1 | 1.1 -- 1.3 |
1.4.x | 1.2/1.3 | 1.2 -- 1.4 | 1.2 | 1.1 -- 1.4 |
5 | 1.5 | 1.2 -- 1.5 | 1.5 | 1.1 -- 1.5 |
6 | 1.6 | 1.2 -- 1.6 | 1.6 | 1.1 -- 1.6 |
7 | 1.7 | 1.2 -- 1.7 | 1.7 | 1.1 -- 1.7 |
target和class版本的映射表
target |
class version (major.minor) |
1.1 | 45.3 |
1.2 | 46.0 |
1.3 | 47.0 |
1.4 | 48.0 |
1.5 | 49.0 |
1.6 | 50.0 |
1.7 | 51.0 |
1.8 | 52.0 |
参考资料
https://en.wikipedia.org/wiki/Java_class_file
https://blogs.oracle.com/darcy/entry/source_target_class_file_version
http://stackoverflow.com/questions/27065/tool-to-read-and-display-java-class-versions