java.lang.AbstractMethodError: javax.servlet.jsp.PageContext.getELContext()Ljavax/el/ELContext;
Это исключение в основном означает, что упомянутый метод не может быть найден в пути к классам времени выполнения, хотя он был доступен в пути к классам компиляции либо класса, либо одной из его зависимостей.
Этот метод представлен в JSP 2.1, который тесно связан с сервлетом 2.5. Поскольку Jetty 7 должен поддерживать Servlet 2.5 и, следовательно, не является подозрительным, единственной причиной может быть то, что web.xml
объявлен как Servlet 2.4 или ниже вместо Servlet 2.5. Итак, чтобы решить эту конкретную проблему, вам нужно объявить ваш web.xml
как минимум Servlet 2.5. Тег <web-app>
должен выглядеть следующим образом:
<web-app
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="YourWebAppID"
version="2.5">
Если это не решит проблему, то другая причина заключается в том, что /WEB-INF/lib
или, что еще хуже, /JRE/lib
или /JRE/lib/ext
перегружены специфичными для appserver библиотеками, содержащими более старую версию API сервлета. Например. servlet-api.jar
от Tomcat или j2ee.jar
или javaee.jar
от Glassfish, и так далее. Вам нужно будет очистить эти папки classpath от любых библиотек, которые там не принадлежат, потому что они получают приоритет при загрузке классов и переопределяют собственные библиотеки сервера приложений. Библиотеки, специфичные для сервера приложений, принадлежат данному серверу приложений, а не веб-приложению или JRE.
Тем не менее, кроме реальной проблемы, атрибуты @page
language="java" contentType="text/html; charset=utf-8"
являются излишними. language
по умолчанию уже Java, а contentType
уже по умолчанию text/html
, а charset
будет уже установлен на UTF-8
, если вы установите pageEncoding="UTF-8"
. Так что уже достаточно:
<%@page pageEncoding="UTF-8" %>