Java ClassVersionError 虽然版本好像没问题

Java ClassVersionError although version seems to be okay

我的 java 网络应用程序出现以下错误(应用程序启动正常,但当我单击按钮时出现以下错误)。我正在使用 Tomcat (7.0.109) 来 运行 这个应用程序。
java.lang.UnsupportedClassVersionError: FileDetailsS​​ervlet 已由较新的
版本的 Java 运行时编译(class 文件版本 59.0),此版本仅 Java 运行时
识别 class 文件版本高达 52.0(无法加载 class [FileDetailsS​​ervlet])

之前我用的是Java15(class版本59.0)。但后来我切换到 JDK 和 JRE 1.8.0_311(class 版本高达 52.0)因为其他第 3 方应用程序。

这是我做的一些事情

  1. 我已经检查了 class 版本的 FileDetailsS​​ervlet class 使用这个
    javap -verbose FileDetailsServlet| findstr "major"
    命令。它显示版本是 51.0 (Java 7).
  2. 我在 eclipse 中将 JDK 合规性设置为 1.8。 (项目特定设置)
  3. 更改 JDK 后,我使用 JDK 1.8.0_311
  4. 重新编译了所有文件
  5. 我检查了环境变量。 JAVA_HOME 是“C:\Program Files\Java\jdk1.8.0_311” JRE_HOME 是“C:\Program Files\Java\jre1.8.0_311”,路径是“C:\Program Files\Java\jdk1.8.0_311\bin"

我错过了什么吗?回不去了Java15.那有什么办法吗?

检查您的 class 路径是否有任何来自旧系统的“剩余物”。看起来您没有检查正确的文件。也许您的 FileDetailsS​​ervlet 版本错误,因为某处存在依赖性,或者只是在“独立”JAR 或 WAR-file.

同样重要的是,单独的 Eclipse 设置可能无法涵盖所用容器如何为 servlet 提供服务,那么您使用哪种技术来 运行 FileDetailsS​​ervlet?这是关键点:这个东西你用到 运行(Tomcat,Jetty,其他容器,可能包含在来自 Sprint Boot 或其他类似技术的 fat WAR 或 fat JAR 文件中)必须使用正确的 .class 文件。

因为您使用 Tomcat 作为容器: 您应该检查 tomcat 文件夹下 webapps/appname 文件夹中的 class 文件(将 appname 替换为部署上下文名称)注意:当你 运行 tomcat 来自 Eclipse 这可能与磁盘上的安装文件夹完全不同,但我没有准备好 Eclipse 安装来检查它。