tomcat UnsupportedClassVersionError

Posted

技术标签:

【中文标题】tomcat UnsupportedClassVersionError【英文标题】: 【发布时间】:2021-07-20 01:35:57 【问题描述】:

我在我的 Mac 上安装了 bitnami Tomcat 7 (apache + tomcat + mysql),使用 java 1.7 76。 我的 Mac 使用 java 1.8 运行时。 当我将我的项目(在同一台 Mac 上的 intellij 中制作)部署到 tomcat 并尝试运行它时,我得到了 UnsupportedClassVersionError。我使用哪个版本的 JDK 来编译项目并不重要(我尝试过 apple 1.6、oracle 1.7 和 oracle 1.8 版本),而且我设置的语言级别似乎也不重要。 让应用程序运行的唯一方法是使用语言级别 1.3(使用 JDK 1.7 of 1.8)

为了解决这个问题,我现在将 tomcat 设置为在我的 Mac 上安装的 1.8 JDK 上运行,然后我将 intellij 配置为使用相同的 JDK。 现在一切正常。

我的问题:我是否总是需要使用与运行 tomcat 的 java 版本完全相同的 JDK 版本进行编译?还是我做错了什么。

完整的错误:(有时还会显示UnsupportedClassVersionError: minor version)

HTTP Status 500 - javax.servlet.ServletException: java.lang.UnsupportedClassVersionError: test/TestClass

type Exception report

message javax.servlet.ServletException: java.lang.UnsupportedClassVersionError: test/TestClass

description The server encountered an internal error that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: javax.servlet.ServletException: java.lang.UnsupportedClassVersionError: test/TestClass
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:549)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:455)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause

javax.servlet.ServletException: java.lang.UnsupportedClassVersionError: test/TestClass
    org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:916)
    org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:845)
    org.apache.jsp.index_jsp._jspService(index_jsp.java:94)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause

java.lang.UnsupportedClassVersionError: test/TestClass
    org.apache.jsp.index_jsp._jspService(index_jsp.java:74)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.61 logs.

【问题讨论】:

这能回答你的问题吗? How to fix java.lang.UnsupportedClassVersionError: Unsupported major.minor version 【参考方案1】:

在编译时和运行时阶段使用一个版本的 JDK 和 JRE 始终是一种好习惯,无论是从 IDE 还是 Tomcat 中使用。还要确保使用与运行测试用例(如果有)和 tomcat 相同版本的 JRE,以避免遇到此类问题。

我的问题:我是否总是需要使用完全相同的版本进行编译 JDK作为运行tomcat的java版本?

如果您在较低版本上编译代码并在较高版本上运行它,有时您可能会摆脱这个问题,但您应该尽可能避免这种情况。因此,请尝试使用 IDE 中相同的 JDK 版本进行编译,并使用 Tomcat 中的相同版本的 JRE 来部署您的项目。

【讨论】:

很高兴知道我当前的解决方案是正确的。谢谢你的解释。 如果是这种情况,您可以将其标记为已解决:) 一些额外的提示:注意这也适用于所有使用的库:在 Java8 上构建一个 jar 并在 Java7 上运行它可能会带来同样的问题 - 不仅是您自定义构建的代码。另外,如果你的tomcat以前是在Java8上运行的,然后你把它改成Java7,它就会用Java8编译JSP文件了。 @OlafKock 感谢您提供更多信息。

以上是关于tomcat UnsupportedClassVersionError的主要内容,如果未能解决你的问题,请参考以下文章

使用 Tomcat 7 的 tomcat-maven-plugin - tomcat:deploy 有效,tomcat:undeploy 无效

怎么卸载tomcat

tomcat学习笔记Tomcat源码剖析

tomcat学习笔记Tomcat源码剖析

命令行启动tomcat,怎么配置

tomcat 配置https