运行环境 jre 版本和 jar 包编译版本不一致导致:Unsupported major.minor version 52.0

问题

我在本地使用 Intellij Idea 打包了一个 spark 的程序 jar 包,放到linux集群上运行,报错信息是:Unsupported major.minor version 52.0

环境

本机系统 -> windows10 开发工具 -> Intellij Idea 构建工具 -> maven

集群系统 -> Linux jre -> Java(TM) SE Runtime Environment (build 1.7.0_80-b15)

分析

根据报错 log 可以断定的是由于我本地编译打包所使用的 jdk 版本和 linux 集群的 jre 版本不一致导致的。stanford parser 和 jdk 版本对应关系为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
J2SE 8 = 52,

J2SE 7 = 51,

J2SE 6.0 = 50,

J2SE 5.0 = 49,

JDK 1.4 = 48,

JDK 1.3 = 47,

JDK 1.2 = 46,

JDK 1.1 = 45

可以推断出是由于我打包编译时所使用的 jdk 版本是 jdk8,而集群的 jre 是7,才导致的问题。

解决方法

maven 项目会用 maven-compiler-plugin 默认的 jdk 版本来进行编译,如果不指明版本就容易出现版本不匹配的问题,可能导致编译不通过的问题。解决办法:在 pom 文件中配置 maven-compiler-plugin 插件。

方式一:

1
2
3
4
<properties>
<maven.compiler.target>1.7</maven.compiler.target>
<maven.compiler.source>1.7</maven.compiler.source>
</properties>

方式二:

1
2
3
4
5
6
7
8
9
10
11
12
13
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>

一些补充

如果使用 scala 编写 spark 的程序,在编译打包时候要注意 scala 的版本号和 jdk 版本的对应关系,同时也要考虑集群上 jre 的版本。比如我的集群上所使用的 jre 的版本号为 7,那么本机打包编译的 jdk 版本必须为 7 ,那么 scala 版本必须为 2.12 版本以下。

Intellij Idea 设置「开发」运行时所用的 jdk 版本的几个地方:

如果上图中 Intellij Idea 的开发运行 jdk 版本配置错误,在开发运行编译的时候会报:Error:java: 无效的源发行版: xx