我的Mac上有一个bitnam 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 of 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.
答案 0 :(得分:1)
将JDK和JRE的一个版本用于编译时和运行时阶段始终是一个好习惯,无论是从IDE还是Tomcat使用。另外,请确保使用与运行测试用例(如果有)相同的JRE版本。 tomcat避免遇到这类问题。
我的问题:我是否总是需要使用完全相同的版本进行编译 JDK作为运行tomcat的java版本?
如果您在较低版本上编译代码并在较高版本上运行代码,有时您可能会解决此问题,但如果可能,您应该避免这种情况。因此,尝试使用IDE中的相同JDK版本进行编译,并使用Tomcat中相同版本的JRE来部署项目。