spark提交jar包時出現unsupported major.minor version 52.0錯誤的解決方案
一、問題:
最近在spark集群上做一個項目,打包提交jar包時,出現了unsupported major.minor version 52.0的報錯,而在local模式運行卻能正常運行!
二、錯誤原因:
查閱諸多資料得出的結論就是:項目編譯得到的class文件的版本高於運行環境中jre的版本號,高版本JDK編譯的class不能在低版本的jvm虛擬機下運行,否則就會報這類錯,因此無法運行!49,50,51,52是Java編譯器內部的版本號,版本對應信息如下:
Unsupported major.minor version 52.0 對應於 JDK1.8(JRE1.8)
Unsupported major.minor version 51.0 對應於 JDK1.7(JRE1.7)
Unsupported major.minor version 50.0 對應於 JDK1.6(JRE1.6)
Unsupported major.minor version 49.0 對應於 JDK1.5(JRE1.5)
因此出現問題的原因就是:編譯產生的class文件是jdk1.8版本的,而jvm環境低於1.8,因此報錯:
三、解決過程:
首先我先去產看了一下編譯產生的class文件的版本號,進入工程目錄的class文件所在文件夾,使用 javap -verbose classname.class命令(classname是編譯得到的class名,這裏我的是JTool)查看編譯版本如下:
major version: 52,即編譯的jdk版本是1,8的,因此必須運行在1.8的jvm中,接下來我又去查看ubuntu的jdk版本:
用java -version查看jdk版本如下:
可以看出,ubuntu的java版本也是jdk1.8的,因此應該是可以去正常運行的!考慮到這是在spark集群上運行jar包,我有思考是不是spark配置裏面默認使用了低版本的jdk,導致問題的出現,便又去查看了spark的環境配置文件spark-env.sh,如下:
果然,spark配置文件中的java版本是jdk1.7的,和ubuntu環境配置的java版本不一致,這就導致了問題的出現!只要把spark-env.sh中JAVA_HOME的參數修改為已安裝的jdk目錄就可以了!
至此,問題解決!
四、補充:
眾所周知,軟件基本都有向下兼容的特性,因此高版本的jdk是可以編譯產生低版本的class文件的,在IntelliJ IDEA中的方法如下:
首先,進入settings
然後,找到Java Compiler那一項:
做如下修改:
這樣就可以在jdk1.8的環境下,編譯產生1.7的class文件,也就可以在對應低版本的jvm中運行了!
spark提交jar包時出現unsupported major.minor version 52.0錯誤的解決方案