做Java开发的同学应该经常遇到
Unsupported major.minor version 52.0
这样的错误,这个错误是怎么产生的呢?需要从java class文件的版本说起:
java版本分为major和minor, 其中major表示的是java大版本号,例如52表示jdk8, minor主要是一些小的版本更新。
通过javap -verbose 全限定类名可以查看class文件的编译版本。例如:
public class MainClass {
public static void main(String args[]) {
System.out.println("hello world");
}
}
用jdk8编译出来后, javap -verbose MainClass, 结果中可以看到:
SourceFile: "MainClass.java"
minor version: 0
major version: 52
如果用jdk7编译:
SourceFile: "MainClass.java"
minor version: 0
major version: 51
显然,major.minor就是class文件的编译版本
那么这个异常是怎么出现的呢?
一个java文件编译出来后,一般有两种用途:
- 在最终软件中运行
- 打包成库,供其他软件集成
在这两种情况下,java都只具有前向兼容性,也就是低版本编译出来的类文件,可以在高版本集成和运行, 但反过来就会抛出Unsupported major.minor异常了
以上面的MainClass.java为例:
jdk7编译出来, 用java8运行:
能正常输出Hello world
但反过来, jdk8编译,java7运行:
对于集成java库也是一样,jdk7编译出来的包,可以在jdk8上集成,反之则不行