当我在 Linux(java 1.6.x)上将 maven 3.0.3 内置 webapp 部署到 tomcat 7.0.23 并访问在登录页面中发布我的凭据时,出现以下错误。pom.xml 引用 servlet 2.5、jsp 2.1 和 JSTL 1.2。
为什么我会收到此错误?我能做些什么来避免它?
我在同一个 tomcat 实例上部署了其他 .war 文件,并且在这些应用程序中从未遇到过这个问题。
我执行 http GET 的第一个 JSP(login.jsp) 没有引发错误。从第一个 JSP 到第二个 Jsp(ChLogin.jsp) 的 POST 遇到了问题。
============================
根本原因
java.lang.VerifyError: (class: org/apache/jsp/ChLogin_jsp, method: _jspService signature: (Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V) Inconsistent stack height 0 != 1
java.lang.Class.getDeclaredConstructors0(Native Method)
java.lang.Class.privateGetDeclaredConstructors(Class.java:2389)
java.lang.Class.getConstructor0(Class.java:2699)
java.lang.Class.newInstance0(Class.java:326)
java.lang.Class.newInstance(Class.java:308)
org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:172)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:369)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
更新 1
webapp 的 WEB-INF\lib 不包含 servlet、jsp 或 JSTL jar。它包含许多应用程序依赖项和 spring jar(我们使用 spring MVC)。
更新 2
我们不预编译 JSP。不过,这是另一天的目标。
UPDATE 3
发现这个问题不在tomcat 7.0.12、7.0.14、7.0.16 中,而是从7.0.19 开始。发布到 tomcat 用户邮件列表。得到答复,可能是 Eclipse JDT 编译器有问题。通过用tomcat 7.0.16 的JDT 编译器和LO & BEHOLD 替换tomcat 7.0.23/27 中的编译器来验证确实如此,一切都很好。我打算写信给 Eclipse JDT 编译器团队(如果有的话)并发布有关此错误的信息。