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>
Ответ 3
Проверьте эту страницу
http://www.jarfinder.com/index.php/java/info/org.apache.jasper.runtime.HttpJspBase
Найдите, какие банки вы использовали в этом. Removeone, если вы найдете два.:)
Ответ 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 работает хорошо для меня.