anj*_*anb 19 java tomcat exception verifyerror
当我在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)
Run Code Online (Sandbox Code Playgroud)
更新1
webapp的WEB-INF\lib不包含servlet,jsp或JSTL jar.它包含许多应用程序依赖项和spring jar(我们使用spring MVC).
更新2
我们不预编译JSP.不过,这是另一天的目标.
更新3
发现此问题不在tomcat 7.0.12,7.0.14,7.0.16中,而是从7.0.19开始.发布到tomcat用户邮件列表.得到一个答复,可能是日食JDT编译器有问题.通过用tomcat 7.0.16的JDT编译器和LO&BEHOLD替换tomcat 7.0.23/27中的编译器确实是这种情况,一切都很好.我打算写Eclipse JDT编译器团队(如果有的话)并发布有关此错误的信息.
Yve*_*tin 11
此错误意味着已针对特定Servlet/JSP/JSTL实现编译JSP,但Tomcat尝试使用ClassPath中提供的其他实现/版本加载已编译的类.
这可能是因为您的WAR包含带有servlet,jsp和/或jstl API和/或实现的jar文件.由于使用的版本与Tomcat 5.5的版本匹配,它可以在那里工作,但在最近的实现中失败了.
您必须在Maven POM中为此类依赖项设置范围,provided以从WAR中排除这些jar WEB-INF/lib.
要验证即时编译的代码不会加载备用依赖项,您应该运行Tomcat -verbose:class.错误之前的最新行可能有助于猜出错误.
更新2012/05/30
你有什么jasper或javax.el或el-api罐子中WEB-INF/lib?如果是这样,也将它/它们移除.
您使用的taglib也可能专门为Tomcat 5.5 Servlet 2.3 API编译,并在Tomcat 7时中断.
该错误非常明显:创建字节码的 jasper 中存在错误。生成的代码不会清除堆栈帧属性Inconsistent stack height 0 != 1
您可以尝试重新整理代码,拆分为方法,到处移动行,错误可能会消失。另外,您可以从 web.xml (通常在 conf 中的某个位置)发布 jsp servlet (匹配 *.jsp)的相关信息来检查编译器参数吗?