不支持的 major.minor 版本 52.0 (无法加载类)

3
当我运行我的项目时,我遇到了以下异常:
javax.servlet.ServletException: java.lang.UnsupportedClassVersionError: apache/commons/codec/UtilityUtil : Unsupported major.minor version 52.0 (unable to load class apache.commons.codec.UtilityUtil)

我已经研究并发现,如果Java版本与运行时和编译时不同,则会出现此问题。我已经按照以下两篇文章的方法尝试解决,发现我使用的是Java 8,而运行时却是1.7: Unsupported major.minor version 52.0 captive portal How to fix java.lang.UnsupportedClassVersionError: Unsupported major.minor version 我已经将编译版本更改为1.7,但问题仍然存在。我不知道为什么。
运行时版本:1.7.0_45 编译版本:1.7.0_80。

1
正如其他人所指出的,如果您正在编译编解码器库,请确保构建集目标兼容性为1.7。另一方面,如果您要直接使用已有的编解码器库(例如从Maven Central或其他二进制存储库中获取),那么您唯一能做的就是升级到Java8运行时,因为您无法更改已编译的二进制文件。 - Andres Almiray
我相当确定我正在使用Java 1.7,但是为了确认是否有一种方法可以查看用于构建的编译版本?我通过查看以下内容确认我正在使用1.7:项目-->属性-->Java构建路径(确保使用JRE 1.7)项目-->属性-->Java编译器(1.7)在这里。@aalmiray - user7637864
1
问题可能不在于您的编译器设置,而是在于您作为依赖项使用的二进制文件中。请使用 https://github.com/zeroturnaround/bad-classes 检查 Apache codec 依赖项。如果它告诉您它使用了52(根据异常很可能是Java8),那么您要么使用1.8运行代码,要么下载Apache Codec的源代码并尽可能使用1.7进行编译,然后将其设置为项目的依赖项。 - Andres Almiray
4个回答

11

这是一个重复的问题。你正在使用的类可能是使用Java 1.8编译的,而你的jvm是1.7版本。这也包括第三方的jar包。


我已经重新构建并部署了最新的服务器。因此,所有类都必须使用最新版本编译,对吗? - user7637864
哎呀,抱歉我的回答太慢了!你比我快 :) +1 - Luca D'Amico
但第三方JAR包不会被重新构建。 - efekctive
非常感谢您的回复。很抱歉问您这个问题,但我该如何重新构建@efekctive的第三方文件呢? - user7637864
嗨@efekctive。你是正确的。我在构建时使用echo打印了Java版本。它打印出: [echo] Java/JVM版本:1.8 [echo] Java/JVM详细版本:1.8.0_73。我不太确定如何将其更改为1.7 :( 因为我已将编译版本更改为1.7,并删除了JRE 8并包含了jre 7。 - user7637864

2

52等同于J2SE 8。你目前仍在使用Java 1.8版本进行编译(或者你正在使用一些被@efekctive指出已经编译为1.8版本的库)。

请提供你所用的构建命令。


2

正如@efekctive所述,我的构建使用Java 8构建类。将版本更改回7,按预期工作。谢谢大家。


2
请按照以下步骤查找您的JRE版本和JDK版本。

JRE检查

java -version

java版本 "1.7.0_111" OpenJDK运行时环境(IcedTea 2.6.7) (7u111-2.6.7-2~deb7u1) OpenJDK 64位服务器虚拟机 (build 24.111-b01, 混合模式)

JDK检查

javac -version

javac 1.6.0_38

您可以发现两个版本是不同的。因此,请将它们转换成通用版本,这将解决您的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接