今天在使用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版本(本人就出錯在這個地方了)。
參考