Java 错误的主要版本

Java wrong major version

在我们的 hadoop 集群上,我的 Pig UDF 抱怨失败

 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1069: Problem resolving class version numbers for class <classname>

我读了writing a udf in pig kind of like tutorial,问题似乎很清楚,但不幸的是我无法解决它。我的清单不包含版本(这是必需的吗?)并且 javap 报告主要版本 52,代表 java 1.8,尽管我用 1.7 编译它。那么我该如何解决呢?

My manifest does not contain a version (is this necessary?)

版本清单条目与此无关。 class加载程序不关注版本清单条目。

and javap reports major version 52, representing java 1.8,

这是相关的事实。

although I compiled it with 1.7.

这一切都归结为您编译代码的方式,当您说您使用 Java 1.7.

编译时,我认为您是不正确的

我为什么这么说?因为 Java 1.7 java 编译器 无法 创建具有 Java 1.8 版本号的“.class”文件。它根本不理解 Java 8 种语法扩展,以及对 class 文件格式的相应增强。

So how can I solve this?

解决此问题的方法是仔细查看您的构建过程并弄清楚使用 Java 1.8 编译器编译违规 class 的方式和原因。因为毫无疑问,这就是已经发生的事情。

如果您是手动构建(例如通过 运行 "javac" 和 "jar" 从命令行,或者通过单击 IDE 中的按钮)那么现在将是学习 Maven、Ant 和 Gradle.

等构建工具的好时机

跟进

That not true. My setting proofs this, but I guess I found the issue: .settings/org.eclipse.jdt.core.prefs contain several 1.8. entries. This may be due to the fact that at the time of the project creation I had 1.8. installed.

实际上,"prove" 什么都没有...

这告诉我您可能正在使用 Eclipse Java 编译器进行编译,而不是 JDK.

中的 Java 编译器

事实上,您的 Eclipse 编译器正在(或曾经)针对 Java 1.8 目标进行编译...因为这就是您的 Eclipse 设置表明 Eclipse Java 编译器应该执行的操作。如果您使用 Eclipse 编译器编译您的代码,您的 JDK 或 JRE 安装版本不会确定 class 文件版本号。

再一次,我强烈建议您学习使用 Maven、Ant 或 Gradle,这样您的构建过程更可重复且更不容易出错。

我想 Stephen C 的答案是最笼统的。

在我的特殊情况下,问题是项目特定的编译器合规性设置错误,因为我在创建项目时在本地使用了 JDK 1.8,后来安装了 1.7,当我在群集。

这个选项非常隐蔽,可以在这里找到: Window > Preferences > Java > Compiler > "Configure project specific settings" > [projectname] > "Compiler compliance level"