我正在设置一个 Tomcat 服务器来托管 JSP 站点。我在 Eclipse 中创建了一个测试应用程序以确保一切正常。它所做的就是在 JSP 中打印文本,然后调用自定义类中的函数,该函数也会打印文本。这在 Eclipse 中运行良好(与 Tomcat 在同一台计算机上运行),但当我将程序编译为 WAR 文件并尝试从 Tomcat 运行它时,它会引发异常:
message javax.servlet.ServletException: java.lang.UnsupportedClassVersionError: jsp/test/TestClass : Unsupported major.minor version 51.0 (unable to load class jsp.test.TestClass)
description The server encountered an internal error that prevented it from fulfilling this request.
org.apache.jasper.JasperException: javax.servlet.ServletException: java.lang.UnsupportedClassVersionError: jsp/test/TestClass : Unsupported major.minor version 51.0 (unable to load class jsp.test.TestClass)
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:549)
...
root cause
javax.servlet.ServletException: java.lang.UnsupportedClassVersionError: jsp/test/TestClass : Unsupported major.minor version 51.0 (unable to load class jsp.test.TestClass)
org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:912)
...
root cause
java.lang.UnsupportedClassVersionError: jsp/test/TestClass : Unsupported major.minor version 51.0 (unable to load class jsp.test.TestClass)
org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2899)
...
我应该指出的是,一旦我刷新页面,错误就会变为正常,UnsupportedClassVersionError
并且会丢失“major.minor”的内容。不知道那里发生了什么。
Google 告诉我,这与运行时版本比编译器旧有关,但据我所知,Eclipse 和 Tomcat 都使用最新版本。它们在同一台计算机上,所以它们应该使用相同的 JAVA_HOME 变量,对吗?我有许多不同的 JRE / JDK 安装,我尝试过将其中几个作为 JAVA_HOME,但似乎没有任何变化(我每次都重新启动 Tomcat)。截至目前,它是:
JAVA_HOME = C:\Program Files\Java\jdk1.7.0_25
Path = C:\Program Files\Java\jdk1.7.0_25\bin; ...
是否还需要为 Tomcat 设置其他内容才能使用此版本的 Java?或者我需要将 JAVA_HOME 指向其他位置?我也尝试了几种 JRE 安装,但一无所获。对此有什么想法吗?
所有这些都是在 Windows Server 2008 R2 上使用 Tomcat 7 完成的。
提前致谢。
道格
答案1
在 Eclipse 中,转到项目首选项,转到 Java 编译器设置。
是什么编译器合规级别?
如果你使用 Tomcat 7 和 Java 7 运行此程序,则合规级别应设置为1.7。如果不是,那么这可能是你的问题。虽然只要它<=就应该没问题1.7,您是否恰好没有为 Java 8 的快照配置 eclipse?
无论如何,了解这个值可能有助于阐明这个问题。
答案2
UnsupportedClassVersionError
当您“使用”一个版本(针对一个版本)进行编译并使用以前的 Java 版本执行时,始终会出现。
JAVA_HOME
不会告诉操作系统应该在哪里查找 java.exe 文件。操作系统将从 PATH 变量中获取该文件。这就是为什么建议在变量开头添加PATH
路径JAVA_HOME/bin
。
如果不是这种情况,堆栈跟踪(错误消息的其余部分)可能会有用。特别是“不支持 major.minor”或类似内容,以及数字。
附加信息。
答案3
您如何通过 Eclipse(WTP)将代码部署到 Tomcat,或者使用特定的构建工具构建 WAR,然后手动将其部署到本地 Tomcat?