решение для java.lang.VerifyError в Tomcat 7.0.23 / JDK 1.6.x? - PullRequest
19 голосов
/ 30 марта 2012

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

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

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

1-й JSP (login.jsp), которыйЯ сделал http GET, не выдавал ошибку.POST от 1-го JSP до 2-го 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 веб-приложения НЕ содержит сервлетов, jsp или jstl-файлов.Он содержит множество зависимостей приложений и пружинных фляг (мы используем Spring MVC).

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

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

Ответы [ 6 ]

11 голосов
/ 03 апреля 2012

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

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

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

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

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

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

4 голосов
/ 27 мая 2012

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

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

2 голосов
/ 26 апреля 2012

Вы пытались отключить Split Verifier : -XX:-UseSplitVerifier

Вот справочник по параметрам JVM: http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

Я видел нечто подобное с Java7 и ошибка VerifyError.

1 голос
/ 02 мая 2012

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

0 голосов
/ 25 марта 2016

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.

0 голосов
/ 25 июля 2012

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

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

Решением было заменить тег jsp на тег jstl:

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

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

...