一、问题:
最近在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中运行了!