【问题标题】:org/hibernate/HibernateException : Unsupported major.minor version 52.0 (unable to load class org.hibernate.HibernateException)org/hibernate/HibernateException:不支持的 major.minor 版本 52.0(无法加载类 org.hibernate.HibernateException)
【发布时间】:2017-04-03 14:10:20
【问题描述】:

我正在做这个项目,我有一个用 Java (HttpServlet) 完成的 Web 服务,它使用 Hibernate 来选择、插入和更新信息到数据库中,并将对象数组作为 JSON 返回给连接到 JSON 端点的任何人。

我在本地计算机上创建了它,它工作正常。不过,我现在正试图看看它如何在实际服务器上而不是在本地运行。

所以我通过 SSH 连接到服务器并将 .war 构建复制到 Tomcat webapps 文件夹,尝试运行它,然后出现以下错误:

javax.servlet.ServletException: Servlet execution threw an exception

root cause java.lang.UnsupportedClassVersionError: org/hibernate/HibernateException : Unsupported major.minor version 52.0 (unable to load class org.hibernate.HibernateException)

因此,我很自然地查看了 StackOverflow 以了解此错误的含义,我发现这是您在一个 Java 版本中创建项目并尝试在劣质 Java 机器上运行该项目时发生的。我确实做到了。

我使用 Java 8 创建了我的项目,并在服务器上的 Java 7 上运行它。所以我更新了服务器以使用 Java 8。但是,在更新到 Java 8 之后,我仍然得到同样的错误。

如果我运行 java -version 命令,我会得到以下结果:

本地计算机:

java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)

服务器:

java version "1.8.0_111"
Java(TM) SE Runtime Environment (build 1.8.0_111-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)

如您所见,我在本地机器上有 java 1.8.0_121,在服务器上有 java 1.8.0._111。你认为这有可能是问题所在吗?他们不是都是 Java 8 吗?

另外,Tomcat 是如何知道使用哪个 java 的?我在服务器上有 3 个版本(Java 7 的 2 个版本和 Java 8 的一个版本,java 1.8.0_111)。 Tomcat 如何知道使用哪一个?

为了选择使用哪一个,我使用了sudo update-alternatives --config java 命令并从那里选择了 1.8.0_111 版本(服务器是 Ubuntu 12.04)。

问题是 - 我不断收到该错误:java.lang.UnsupportedClassVersionError: org/hibernate/HibernateException : Unsupported major.minor version 52.0 (unable to load class org.hibernate.HibernateException) - 我无法在服务器上运行我的项目。

有什么建议吗?

【问题讨论】:

标签: java hibernate tomcat


【解决方案1】:

几天前我收到此错误时,我的机器上运行了不同版本的 JDK 和 JRE。我通过在项目的构建路径以及 Window Preferences->Java->Installed JRE's 中设置正确的 JRE 路径来纠正它。此外,如果您转到 Tomcat\bin 中的 setenv.bat,您可以通过以下方式指定 Tomcat 应使用的 java 版本:
set "JRE_HOME=%ProgramFiles%\Java\jre1.8.0_121" ,(obv,您的版本可能不同,因此请相应更改)。 希望能解答您的疑问!

编辑:如果您想知道 setenv.bat 是什么,请参阅:https://docs.oracle.com/cd/E40518_01/integrator.311/integrator_install/src/cli_ldi_server_config.html 它解释了该 bat 文件应包含的内容。

【讨论】:

  • 我在 Linux 中,没有“Tomcat\bin”文件夹。你知道在 Linux 下你在哪里设置这个变量吗?让我谷歌一下。
  • 如果我执行echo $JAVA_HOME" 我得到这个:echo $JAVA_HOME /usr/lib/java/jdk1.8.0_111 所以看来正确的 java 版本可用(在终端中,我想 Tomcat 可以通过以下方式获取要使用的 java 版本变量,所以它应该使用正确的版本)。
  • 啊!应该是JRE_HOME,JDK_HOME好像没问题,再检查一下!另外,试试这个:如果您使用的是 Eclipse,请转到 Run->External Tools Configuration->JRE 选项卡,然后查看它使用的是哪个版本的 JRE。这是我对此的最后猜测!告诉我。
  • 我正在使用 Netbeans。如果我转到项目属性 - 库 - 选择 JDK 1.8。所以它使用了正确的JDK。不过,它也使用 Hibernate。也许Hibernate有问题?毕竟,我得到了unable to load class org.hibernate.HibernateException 错误。
  • 项目属性是另一个,运行时配置设置是另一个。如果您已经设置了项目道具,那就太好了。在您的 IDE 中寻找另一个可能性,它选择哪个版本的 JRE 来执行您的应用程序。对于您的休眠问题,请检查:stackoverflow.com/a/18223559/1004631
【解决方案2】:

根据Documentation

Hibernate 5.2 及更高版本至少需要 Java 1.8 和 JDBC 4.2。

Hibernate 5.1 和更早的版本至少需要 Java 1.6 和 JDBC 4.0。

从源代码构建 Hibernate 5.1 或更早版本时,由于 JDK 1.6 编译器中的错误,您需要 Java 1.7。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-24
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 2017-01-23
    • 2017-06-13
    • 1970-01-01
    相关资源
    最近更新 更多