exception 아파치 - tomcat 7.0.23 / jdk 1.6.x의 java.lang.VerifyError 용 솔루션?




vs guide (6)

이 오류는 JSP가 특정 Servlet / JSP / JSTL 구현을 위해 컴파일되었다는 것을 의미하지만 Tomcat은 ClassPath에서 사용할 수있는 다른 구현 / 버전으로 컴파일 된 클래스를로드하려고 시도합니다.

이는 WAR에 서블릿, jsp 및 / 또는 jstl API 및 / 또는 구현이 포함 된 jar 파일이 포함되어 있기 때문에 발생합니다. 사용 된 버전이 Tomcat 5.5 버전과 일치하기 때문에 Tomcat 5.5 버전에서 작동하지만 더 최근의 구현에서는 실패합니다.

WAR WEB-INF/lib 에서 해당 jar를 제외하기 위해 Maven POM에서 이러한 종속성에 대해 provided scope 를 설정해야합니다.

직접 컴파일 된 코드가 대체 의존성을로드하지 않는지 확인하려면 Tomcat을 -verbose:class 와 함께 실행해야합니다. 오류가 발생하기 전에 최신 행이 무엇이 잘못되었는지 추측하는 데 도움이 될 수 있습니다.

업데이트 2012/05/30 WEB-INF/lib jasper 또는 javax.el 또는 el-api 항아리가 있습니까? 그렇다면 제거하십시오.

사용 된 taglib가 Tomcat 5.5 Servlet 2.3 API 용으로 특별히 컴파일되어 Tomcat 7이 중단 될 수도 있습니다.

Linux (java 1.6.x)의 tomcat 7.0.23에 빌드 된 maven 3.0.3 웹 응용 프로그램을 배포하고 로그인 페이지에 내 자격 증명을 게시하면 다음 오류가 발생합니다. pom.xml은 서블릿 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가 포함되어 있지 않습니다. 여기에는 많은 응용 프로그램 종속성 및 스프링 jar (스프링 MVC 사용)가 포함되어 있습니다.

업데이트 2
우리는 JSP를 미리 컴파일하지 않습니다. 그것은 또 다른 날의 목표입니다.

업데이트 3
이 문제는 tomcat 7.0.12, 7.0.14, 7.0.16에서 발견되지 않았지만 7.0.19부터 발견되었습니다. 바람둥이 사용자 메일 링리스트에 게시 됨. 실수로 일식 JDT 컴파일러 일 것이라는 대답을 받았습니다. Tomcat 7.0.23 / 27의 컴파일러를 tomcat 7.0.16의 JDT 컴파일러 및 LO & BEHOLD로 대체하여 실제로 그런 경우가 있는지 확인했습니다. 모두 정상입니다. 이클립스 JDT 컴파일러 팀 (있는 경우)에게 쓰고이 오류에 대해 게시 할 계획이다.


클래스 패스 ( System.out.println("java.class.path"); )를 인쇄 해보십시오. tomcat5 및 tomcat7의 클래스 경로를 비교하십시오. 클래스 패스의 차이점을 확인하십시오.



java.lang.VerifyError :

쉬운 승 / A

이것은 Tomcat 컴파일러가 내장되어 있기 때문입니다.

Eclipse JDT의 Java 컴파일러가 기본 컴파일러로 포함되어 있습니다. Tomcat 클래스 로더의 모든 종속성을로드하는 고급 Java 컴파일러로, 수십 개의 JAR이있는 대규모 설치에서 컴파일 할 때 대단히 도움이됩니다. 빠른 서버에서는 큰 JSP 페이지조차도 1 초 미만의 재 컴파일 사이클을 허용합니다.

이러한 문제가 보이는 경우 아래의 해결 방법을 따르십시오.

이전 Tomcat 릴리스에서 사용 된 Apache Ant는 lib / ecj - *. jar 파일을 제거하고 최신 Ant 배포본에서 ant.jar 및 ant-launcher.jar 파일을 배치하여 새 컴파일러 대신 사용할 수 있습니다 lib 폴더에 있습니다.


오류는 아주 분명합니다. 바이트 코드를 작성하는 벽옥에 버그가 있습니다. 생성 된 코드가 스택 프레임을 지우지 못함 propery Inconsistent stack height 0 != 1 되지 Inconsistent stack height 0 != 1

코드를 섞어서 메서드로 분할하고 여기 저기에 줄을 이동하면 버그가 사라질 수도 있습니다. 또한 web.xml (보통 conf의 어딘가)에서 jsp servlet (* .jsp와 일치)의 관련 정보를 게시하여 컴파일러 매개 변수를 확인할 수 있습니까?


다음과 같이 protected 생성자를 생성하십시오 (또한 Exception 클래스 [Serializable] 표시해야합니다).

protected MyException(System.Runtime.Serialization.SerializationInfo info,
    System.Runtime.Serialization.StreamingContext context):base(info,context)
{
}




java exception tomcat verifyerror