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

Когда я пытаюсь запустить мой webapp на 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 librairies, но я не знаю, какие они. Как я могу их выяснить и решить?

Ответ 1

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

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

См. также:

Ответ 2

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

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

Ответ 4

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

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

    <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>

Ответ 5

Это странная ERROR, я когда-либо был

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

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

Servlet-api.jar или javax-servlet-api.jar jsp-api.jar или javax-servlet-jsp.jar

Но это не совместимо с моим сервером TOMCAT Поэтому я просто удаляю эти две банки из моего встроенного пути и сборки сборки Теперь я переехал "E:\Locker\Software\Apache-6.0.44-кот\Lib" где мой сервер Tomcat и добавьте эти два баночки в мой проект

servlet-api.jar
jsp-api.jar

Ответ 6

Вы правы, если вы просто добавите зависимость el-api, она будет конфликтовать с файлами jar, проприетарными для Tomcat, и вы получите исключение времени выполнения во время запуска.

Однако вот одно из работающих и эффективных решений для этого:

Просто добавь:

   <dependency>
        <groupId>javax.el</groupId>
        <artifactId>javax.el-api</artifactId>
        <version>2.2.2</version>
    </dependency>

Но убедитесь, что эта версия не самая последняя. Например, 2.2.2 работает хорошо для меня.