問題
我在本地使用 Intellij Idea 打包了一個 spark 的程序 jar 包凉泄,放到linux集群上運行距潘,報錯信息是:Unsupported major.minor version 52.0
環(huán)境
本機系統(tǒng) -> windows10 開發(fā)工具 -> Intellij Idea 構(gòu)建工具 -> maven
集群系統(tǒng) -> Linux jre -> Java(TM) SE Runtime Environment (build 1.7.0_80-b15)`
分析
根據(jù)報錯 log 可以斷定的是由于我本地編譯打包所使用的 jdk 版本和 linux 集群的 jre 版本不一致導(dǎo)致的笋熬。stanford parser 和 jdk 版本對應(yīng)關(guān)系為:
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,才導(dǎo)致的問題灸撰。
解決方法
maven 項目會用 maven-compiler-plugin 默認的 jdk 版本來進行編譯挪捕,如果不指明版本就容易出現(xiàn)版本不匹配的問題粗梭,可能導(dǎo)致編譯不通過的問題。解決辦法:在 pom 文件中配置 maven-compiler-plugin 插件级零。
方式一:
<properties>
<maven.compiler.target>1.7</maven.compiler.target>
<maven.compiler.source>1.7</maven.compiler.source>
</properties>
方式二:
<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 版本的對應(yīng)關(guān)系滞乙,同時也要考慮集群上 jre 的版本。比如我的集群上所使用的 jre 的版本號為 7鉴嗤,那么本機打包編譯的 jdk 版本必須為 7 斩启,那么 scala 版本必須為 2.12 版本以下。
Intellij Idea 設(shè)置「開發(fā)」運行時所用的 jdk 版本的幾個地方:
如果上圖中 Intellij Idea 的開發(fā)運行 jdk 版本配置錯誤醉锅,在開發(fā)運行編譯的時候會報:Error:java: 無效的源發(fā)行版: xx