Решение для 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 (если есть) и сообщить об этой ошибке.
Ответы
Ответ 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.
Ответ 3
Вы пытались отключить Split Verifier: -XX:-UseSplitVerifier
Вот ссылка на опции JVM: http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html
Я видел нечто похожее на Java 7 и VerifyError.
Ответ 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.