1. 程式人生 > >spark提交jar包時出現unsupported major.minor version 52.0錯誤的解決方案

spark提交jar包時出現unsupported major.minor version 52.0錯誤的解決方案

模式 classname jdk版本 images pil 編譯器 就會 home spark

一、問題:

    最近在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錯誤的解決方案