Вопрос или проблема
Я пытаюсь правильно настроить свой сервер, чтобы запускать на нем сервлеты с помощью Jenkins. В папке webapps находятся два файла war. Один для Jenkins и один для примера от Apache. Оба работают нормально, но когда я пытаюсь получить доступ к localhost:8080, я получаю ошибку HTTP 500.
Я впервые обнаружил ошибку, когда пытался развернуть веб-приложение на Spring. Все попытки пока что потерпели неудачу, хотя если я запускаю веб-приложение на своем ноутбуке, оно работает нормально, так что я предполагаю, что файл war и само веб-приложение в порядке.
Есть ли вероятность, что предыдущие файлы war, которые я пытался развернуть, вызвали какую-то проблему?
На ноутбуке не установлен Jenkins – может быть, Jenkins вызывает проблему?
Я искал в различных сообщениях и пытался найти файл jar в других папках внутри директории webapp, но ничего не нашел. Затем я удалил все файлы war, кроме Jenkins. Jenkins загружается, но главная страница не отображается.
Спасибо за любую помощь.
Полное сообщение об ошибке:
HTTP Status 500 - java.lang.ClassCastException: org.apache.jasper.runtime.ELContextImpl cannot be cast to org.apache.jasper.el.ELContextImpl
type Exception report
message java.lang.ClassCastException: org.apache.jasper.runtime.ELContextImpl cannot be cast to org.apache.jasper.el.ELContextImpl
description The server encountered an internal error that prevented it from fulfilling this request.
exception
org.apache.jasper.JasperException: java.lang.ClassCastException: org.apache.jasper.runtime.ELContextImpl cannot be cast to org.apache.jasper.el.ELContextImpl
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:549)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:470)
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:728)
root cause
java.lang.ClassCastException: org.apache.jasper.runtime.ELContextImpl cannot be cast to org.apache.jasper.el.ELContextImpl
org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:1023)
org.apache.jsp.index_jsp._jspService(index_jsp.java:85)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
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:728)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.42 logs.
Когда я получил это сообщение, пытаясь развернуть веб-приложение (то, которое работает на ноутбуке), строка ошибки была там, где использовался jstl, но в данном случае веб-приложение больше не находится на сервере, и я просто пытаюсь получить доступ к localhost.
Развернутое приложение, вероятно, включило свою собственную версию jasper.jar
. Удалите jasper.jar
из директории /WEB-INF/lib
приложения. См. https://stackoverflow.com/questions/12384779/org-apache-jasper-el-elcontextimpl-cannot-be-cast-to-org-apache-jasper-runtime-e для получения дополнительных деталей.
Ответ или решение
Почему возникает ошибка HTTP 500 на странице localhost Tomcat и как её исправить
Ошибка HTTP 500, которую вы получаете при попытке доступа к localhost:8080
, указывает на внутреннюю ошибку сервера. Посмотрим на подробности проблемы и возможные решения.
Описание проблемы
Согласно вашему описанию, HTTP 500 возникает с сообщением об ошибке java.lang.ClassCastException: org.apache.jasper.runtime.ELContextImpl cannot be cast to org.apache.jasper.el.ELContextImpl
. Эта ошибка связана с несовместимостью версий библиотек, используемых JSP (JavaServer Pages), и вероятнее всего, вызвана конфликтами между библиотеками Jasper, используемыми вашим приложением и библиотеками, находящимися в Tomcat.
Возможные причины проблемы:
-
Конфликт версий Jasper: Возможно, что ваш веб-приложение (WAR файл) содержит свою версию
jasper.jar
и других связанных библиотек, которые конфликтуют с версиями, предоставляемыми Tomcat. -
Неосвобожденные ресурсы: При удалении WAR файлов предыдущие совместимые библиотеки могут остаться в каталоге
WEB-INF/lib
, что приведет к конфликтам. -
Установка Jenkins: Jenkins сам по себе не должен вызывать такую ошибку, но если он имеет конфликты с библиотеками, используемыми вашим приложением, это может быть связано.
Шаги для исправления ошибки
-
Проверьте ваши WAR файлы: Убедитесь, что в ваших WAR файлах, включая Spring приложение, отсутствуют библиотеки, которые уже присутствуют в Tomcat. Особенно обратите внимание на следующие библиотеки:
jasper.jar
jsp-api.jar
servlet-api.jar
Если они присутствуют в
WEB-INF/lib
, удалите их. -
Очистка старых развертываний: Убедитесь, что старые версии WAR файлов и (или) их артефакты в
WEB-INF/lib
удалены. Перезапустите Tomcat после удаления всех конфликтующих библиотек и WAR файлов, чтобы убедиться, что Tomcat перезагрузил актуальные библиотеки. -
Проверьте конфигурацию вашего проекта: Убедитесь, что ваш проект на Spring корректно настроен. Структура должен выглядеть как:
/yourProject ├── src ├── WEB-INF │ ├── lib │ ├── web.xml
-
Чистка и новое развертывание: Выполните сборку вашего WAR файла через Maven или Gradle с командой, которая очищает (clean) и создает (build) проект. Например, для Maven:
mvn clean package
-
Проверьте логи Tomcat: Зайдите в
logs/catalina.out
илиlogs/<дата>.log
в каталоге установки Tomcat для получения дополнительной информации о том, что именно вызывает ошибку.
Заключение
Ошибки HTTP 500 могут быть вызваны множеством факторов, но наиболее вероятная причина в вашем случае – конфликт версий библиотек JSP и Jasper. Проверьте на наличие конфликтующих JAR файлов в ваших WAR файлах и выполните очистку сервера Tomcat. Эти шаги должны помочь вам устранить внутренние ошибки сервера и корректно развёртывать ваши приложения. Если проблемы сохраняются, проверьте соответствие версий Spring и JSP, так как несоответствие может также вызывать подобные ошибки.