今天在使用Ant编译build.xml文件时报错"java.lang.UnsupportedClassVersionError:com/sun/tools/javac/Main : Unsupported major.minor version 51.0",很明显是JDK版本不一致所导致的,但是我用的JDK8,Eclipse配置貌似也都正常(Windows——Preferences——Java——Compiler(配置的为1.8)——Installed JREs(勾选的是JDK1.8的安装路径)),再看Ant——Runtime——Classpath(tab项)——Global Entries(此处的tools.jar也是位于JDK1.8安装路径下的lib目录中的tools.jar)。实在找不到原因,就去谷歌搜索,终于把问题解决了,先记录如下:

原因分析

  我们知道Java是支持向后编译的,也就是说,在低版本(如JDK6)上编译的class文件或者jar文件可以在高版本上(如JDK8)上编译通过,但这并不意味着在JDK7上编译的class文件就可以在JDK5上顺利通过编译。为什么?因为高版本通常有很多低版本不支持的新特性。想想看,你能够在JDK5上编译含有lambda表达式或者Stream API的代码吗?当然不行。即便你没有使用那些低版本不支持的新特性,每个class文件都有一个major或者minor版本号,这是存在于Java编译器中的,并且和JDK的版本号是对应的,下面我们列出对应JRE的major版本号:

Java SE 8 = 52,
Java SE 7 = 51,
Java SE 6.0 = 50,
Java SE 5.0 = 49,
JDK 1.4 = 48,
JDK 1.3 = 47,
JDK 1.2 = 46,
JDK 1.1 = 45

我们可以发现Java8的major版本号是52,这就意味着如果你使用JDK8执行javac命令,将会默认生成一个major版本号为52的class文件,如果你使用JDK7运行这个class文件,你就会收到"Unsupported major.minor version 52.0"。

解决方案

  除了本博文一开始必须要做的几处检查外,还有一处我们必须考虑,右键build.xml文件,Run As——External Tools Configurations,打开JRE选项卡,在Separate JRE选项中必须选择和你编译版本一致的JDK版本(本人就出错在这个地方了)。

参考

http://stackoverflow.com/questions/7073485/why-is-ant-giving-me-a-unsupported-major-minor-version-error

posted on 2016-06-21 14:16  阳光沙滩  阅读(12986)  评论(2编辑  收藏  举报