Подтвердить что ты не робот

Решение для java.lang.VerifyError в tomcat 7.0.23/jdk 1.6.x?

Когда я развернул maven 3.0.3, встроенный webapp в tomcat 7.0.23 на Linux (java 1.6.x), и доступ к нему отправил мои учетные данные на странице входа в систему, я получил следующую ошибку. pom.xml ссылается на сервлет 2.5, jsp 2.1 и JSTL 1.2.

Почему я должен получить эту ошибку? что я могу сделать, чтобы избежать этого?

У меня есть другие файлы .war, развернутые на одном экземпляре tomcat и никогда не сталкивались с этой проблемой в этих приложениях.

Первый JSP (login.jsp), который я сделал http GET, не выдавал ошибку. Проблема с POST с первого JSP на второй Jsp (ChLogin.jsp) столкнулась с проблемой.

===========================


  первопричина

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
WEB-INF\lib из webapp НЕ содержит банки сервлетов, jsp или JSTL. Он содержит множество зависимостей приложений и spring jars (мы используем spring MVC).

ОБНОВЛЕНИЕ 2
Мы не компилируем JSP. Это цель еще на один день.

ОБНОВЛЕНИЕ 3
Обнаружено, что эта проблема не была в tomcat 7.0.12, 7.0.14, 7.0.16, но началась с 7.0.19. Добавлено в список рассылки пользователей tomcat. получил ответ, что это был, возможно, компилятор Eclipse JDT. Проверено, что это действительно так, заменив компилятор в tomcat 7.0.23/27 компилятором Tomcat 7.0.16 JDT и LO и BEHOLD, все хорошо. Я планирую написать команде компилятора Eclipse JDT (если есть) и сообщить об этой ошибке.

4b9b3361

Ответ 1

Ошибка очевидна: в яшме есть ошибка, создающая байт-код. Сгенерированный код не очищает фрейм стека Inconsistent stack height 0 != 1

Вы можете попытаться перетасовать код, разделить на методы, переместить строки здесь и там, и ошибка может исчезнуть. Также вы можете опубликовать соответствующую информацию о сервлете jsp (соответствие *.jsp) из web.xml(обычно где-нибудь в conf) для проверки параметров компилятора?

Ответ 2

Эта ошибка означает, что JSP был скомпилирован для конкретной реализации Servlet/JSP/JSTL, но затем Tomcat пытается загрузить скомпилированные классы с другой версией/версией, доступной в ClassPath.

Вероятно, это происходит потому, что ваша WAR содержит файлы jar с сервлетами, jsp и/или jstl API и/или реализацией. Поскольку используемые версии соответствуют Tomcat 5.5 imlementation, он работает там, но не работает с более поздними реализациями.

Вам нужно установить scope на provided для таких зависимостей в вашем Maven POM, чтобы исключить, что банки из WAR WEB-INF/lib.

Чтобы проверить, что скомпилированный код "на лету" не загружает альтернативные зависимости, вы должны запустить Tomcat с помощью -verbose:class. Последние строки перед ошибкой могут помочь угадать, что не так.

Обновление 2012/05/30 У вас есть jasper или javax.el или el-api jar в WEB-INF/lib? Если это так, удалите его и их.

Также возможно, что taglib, который вы использовали, специально скомпилирован для Tomcat 5.5 Servlet 2.3 API и разбивается на Tomcat 7.

Ответ 4

Попробуйте распечатать путь к классам (System.out.println("java.class.path");) Сравните путь класса tomcat5 и tomcat7. Проверьте, в чем разница в пути к классам.

Ответ 5

Это произошло со мной на Tomcat 6.0.35 и только на одной странице jsp, которая имеет только:

<jsp:forward page="/sindicato/consultaServidor.jsp"/>

Решение заменило тег jsp ярлыком jstl:

<c:redirect url="/sindicato/consultaServidor.jsp"/>

И не спрашивай почему! Поскольку у нас больше jsp-страниц с этим тегом jsp (jsp: forward) без проблем.

Ответ 6

java.lang.VerifyError:

Easy W/A

Это из-за встроенного компилятора tomcat.

Компилятор Java из Eclipse JDT включен в качестве компилятора по умолчанию. Это продвинутый компилятор Java, который загрузит все зависимости от загрузчика класса Tomcat, что очень поможет при компиляции на больших установках с десятками JAR. На быстрых серверах это позволит выполнять подсекундные циклы перекомпиляции даже для больших страниц JSP.

Если какие-либо такие проблемы видны, следуйте приведенному ниже обходу

Apache Ant, который использовался в предыдущих выпусках Tomcat, можно использовать вместо нового компилятора, просто удалив файл lib/ecj - *. jar и разместив ant.jar и ant - launcher.jar из последнего дистрибутива Ant в папке lib.