java.lang.LinkageError: javax.servlet.jsp.JspApplicationContext.getExpressionFactory

Когда я пытаюсь запустить свое веб-приложение на Tomcat 7, я получаю следующее исключение:

exception

javax.servlet.ServletException: java.lang.LinkageError: loader constraint violation: when resolving interface method "javax.servlet.jsp.JspApplicationContext.getExpressionFactory()Ljavax/el/ExpressionFactory;
" the class loader (instance of org/apache/jasper/servlet/JasperLoader) of the current class, org/apache/jsp/index_jsp, and the class loader (instance of org/apache/catalina/loader/StandardClassLoader) for resolved class, javax/servlet/jsp/JspApplicationContext, 
have different Class objects for the type javax/el/ExpressionFactory used in the signature
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:343)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

root cause

java.lang.LinkageError: loader constraint violation: when resolving interface method "javax.servlet.jsp.JspApplicationContext.getExpressionFactory()Ljavax/el/ExpressionFactory;" the class loader (instance of org/apache/jasper/servlet/JasperLoader) of the current class, org/apache/jsp/index_jsp, and the class loader (instance of org/apache/catalina/loader/StandardClassLoader) for resolved class, javax/servlet/jsp/JspApplicationContext, have different Class objects for the type javax/el/ExpressionFactory used in the signature
org.apache.jsp.index_jsp._jspInit(index_jsp.java:31)
org.apache.jasper.runtime.HttpJspBase.init(HttpJspBase.java:49)
org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:180)
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)

Кажется, между двумя библиотеками .jar есть конфликт, но я не знаю, какие именно. Как я могу их понять и решить?


person Br3x    schedule 13.12.2011    source источник


Ответы (6)


Это произойдет, если вы включите специфичные для сервера библиотеки другой марки/версии сервера в /WEB-INF/lib вашего веб-приложения, например jsp-api.jar, el-api.jar, servlet-api.jar и т. д. Вам нужно удалить их все. /WEB-INF/lib не должен содержать каких-либо специфичных для сервера библиотек. Они принадлежат самому конкретному серверу (у Tomcat они уже есть в папке /lib).

Кстати, это довольно распространенная ошибка новичков, когда они сталкиваются с ошибками компиляции в JSP/Servlet API в своем проекте IDE. Это нужно было решить по-другому, а именно путем интеграции сервера в IDE и добавления сервера в проект в качестве Target runtime.

Смотрите также:

person BalusC    schedule 13.12.2011
comment
Если Appserver предоставляет несколько классов из jar-файла, как решить эту проблему? Должны ли мы включать отсутствующие классы в каталог lib? - person MaheshVarma; 03.09.2013

У вас есть два варианта добавления библиотек ваших проектов, таких как jsp-api.jar, el-api.jar, servlet-api.jar и т. д.:

  1. Добавьте эти библиотеки как внешние банки в свой Java Build Path;
  2. Добавьте их как maven-зависимости, установив для каждой из них область видимости provided, например:
<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.1</version>
    <scope>provided</scope>
</dependency>
person vadim    schedule 08.02.2013

Проверить эту страницу

http://www.jarfinder.com/index.php/java/info/org.apache.jasper.runtime.HttpJspBase

Найдите, какие банки вы использовали в этом. Удалите один, если найдете два. :)

person Kris    schedule 13.12.2011
comment
Страница, которую вы ищете, была перемещена. начать новый поиск класса Java здесь - person whirlwin; 02.10.2014

Я застрял с этой ошибкой в ​​течение очень долгого времени, и эта тема сэкономила мне немало времени. Добавление некоторых исследований, которые я провел перед решением этой проблемы. Да, нам нужно удалить библиотеки типа jsp-api.jar, el-api.jar, servlet-api.jar из папки /WEB-INF/lib. Но как?

В моем случае я использую Apache Ivy в качестве менеджера зависимостей и использовал Spring MVC. Он загружает все зависимости вместе с упомянутыми выше библиотеками. Во время выполнения эти конфликты с API-интерфейсами, предоставляемыми библиотеками Tomcat. Простым решением было бы исключить эти jar-файлы из зависимостей или создать конфигурации и включить эти библиотеки только в конфигурацию времени компиляции. Что сработало для меня быстро, так это исключение этих библиотек.

    <dependency org="org.springframework" name="spring-webmvc"
        rev="4.0.4.RELEASE">
        <exclude org="javax.servlet" name="javax.servlet-api" />
        <exclude org="javax.servlet.jsp" name="jsp-api" />
        <exclude org="javax.el" name="javax.el-api" />
    </dependency>
person Aniket Thakur    schedule 10.06.2014

Это странная ОШИБКА, которую я когда-либо получал

После исследования я нашел это Причины и решение

Я использую Spring, поэтому в моих библиотеках @spring у меня уже есть такая банка, как

Servlet-api.jar or javax-servlet-api.jar jsp-api.jar or javax-servlet-jsp.jar

Но это несовместимо с моим сервером TOMCAT. Поэтому я просто удаляю эти две банки из моего встроенного пути и сборки развертывания. Теперь я перехожу к моему "E:\Locker\Software\apache-tomcat-6.0.44\lib", где находится мой сервер Tomcat. и добавьте эти две банки в мой проект

servlet-api.jar
jsp-api.jar
person Hasnain Ali Bohra    schedule 01.07.2015

В моем случае у меня была зависимость от tomcat, а также плагин tomcat, упомянутый в POM. Удалил зависимость, оставив там только плагин, и все заработало.

person Yasser Khan    schedule 11.08.2019