Tomcat不支持的类版本错误。

3
我在我的Mac上安装了一个bitnami Tomcat 7(apache + tomcat + mysql),使用的是java 1.7 76版本。而我的Mac使用的是java 1.8运行时。当我将在同一台Mac上使用Intellij制作的项目部署到Tomcat并尝试运行它时,会出现UnsupportedClassVersionError错误。无论我使用哪个版本的JDK来编译项目(我尝试了苹果1.6、Oracle 1.7和Oracle 1.8版本),似乎设置语言级别也没有关系。唯一让应用程序运行的方法是使用语言级别1.3(使用JDK 1.7或1.8)。
为了解决这个问题,我现在将Tomcat设置为在我的Mac上安装的1.8 JDK上运行,然后配置Intellij使用相同的JDK。现在一切都正常了。
我的问题是:我是否总是需要使用与运行Tomcat的Java版本完全相同的JDK来编译?还是我做错了什么?
完整的错误信息:(有时也会显示UnsupportedClassVersionError:次要版本)
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.

这个回答解决了你的问题吗?如何修复java.lang.UnsupportedClassVersionError:Unsupported major.minor version - 9ilsdx 9rvj 0lo
1个回答

1

编译时和运行时最好使用同一版本的JDK和JRE,无论是从IDE还是Tomcat中使用。同时,请确保使用与运行测试用例(如果有)和Tomcat相同的JRE版本,以避免遇到此类问题。

我的问题:我是否总是需要使用与运行Tomcat的Java版本完全相同的JDK进行编译?

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


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

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