java.lang.ClassNotFoundException: javax.servlet.jsp.el.ImplicitObjectELResolver $ ImplicitObjects

после обновления до последней версии eclipse Helios 3.6, M2E 1.0, WTP 3.2.5 и попытки запустить мой проект maven, в котором используется JSF 2.1.3 и Spring 3 на tomcat 7, я получаю следующее исключение:

java.lang.ClassNotFoundException: javax.servlet.jsp.el.ImplicitObjectELResolver$ImplicitObjects$4
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1678)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1523)
    at org.apache.catalina.startup.ContextConfig.checkHandlesTypes(ContextConfig.java:2006)
    at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:1969)
    at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:1858)
    at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:1826)
    at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:1812)
    at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1306)
    at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:896)
    at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:322)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5103)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:148)
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1033)
    at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:774)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:148)
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1033)
    at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:291)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:148)
    at org.apache.catalina.core.StandardService.startInternal(StandardService.java:443)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:148)
    at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:727)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:148)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:621)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:322)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:450)

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/catalina/loader/WebappClassLoader) of the current class, com/sun/faces/config/ConfigureListener, 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
    at com.sun.faces.config.ConfigureListener.registerELResolverAndListenerWithJsp(ConfigureListener.java:693)
    at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:243)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4723)
    at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5226)
    at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5221)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
Dec 17, 2011 4:56:04 PM org.apache.catalina.core.StandardContext listenerStart
SEVERE: Exception sending context initialized event to listener instance of class com.sun.faces.config.ConfigureListener
java.lang.RuntimeException: 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/catalina/loader/WebappClassLoader) of the current class, com/sun/faces/config/ConfigureListener, 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
    at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:292)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4723)
    at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5226)
    at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5221)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
Caused by: 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/catalina/loader/WebappClassLoader) of the current class, com/sun/faces/config/ConfigureListener, 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
    at com.sun.faces.config.ConfigureListener.registerELResolverAndListenerWithJsp(ConfigureListener.java:693)
    at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:243)
    ... 8 more

следующая моя конфигурация для maven:

<dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.0.1</version>
        <scope>provided</scope>
       </dependency>


        <dependency>
         <groupId>com.sun.faces</groupId>
         <artifactId>jsf-api</artifactId>
         <version>2.1.3</version>
        </dependency>

        <dependency>
         <groupId>com.sun.faces</groupId>
         <artifactId>jsf-impl</artifactId>
         <version>2.1.3</version>
        </dependency>

        <dependency>
          <groupId>jstl</groupId>
          <artifactId>jstl</artifactId>
          <version>1.2</version>
        </dependency>

мне не хватает файла jar или я использую несовместимую версию jar?

посоветуйте пожалуйста, спасибо.

ОБНОВЛЕНИЕ: то, что я получил до сих пор, это то, что я могу заставить приложение работать нормально, удалив следующие зависимости из файла pom:

<dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.2.1</version>
           <scope>provided</scope>
          </dependency>

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

Я думаю, что они противоречили банкам, предоставленным контейнером.

ЧТО НУЖНО ЗНАТЬ:

1- Нужно ли мне добавлять зависимости: javax.servlet.jsp-api, javax.el-api в мой файл pom, как указано, или мне вообще не нужно их добавлять?

2- Если мне нужно добавить эти две зависимости, то как мне добавить их должным образом, чтобы они не конфликтовали с банками tomcat, то есть с какой версией, и должен ли я отмечать зависимость как предоставленную или нет?

и важный вопрос, если мне нужно добавить их, почему я должен это делать, какова важность добавления их, поскольку они предоставляются контейнером, что я понимаю до сих пор, это то, что мне нужно добавить зависимость javax.servlet-api и пометить это как предусмотрено, поскольку я использую сервлеты в некоторых классах.


person Mahmoud Saleh    schedule 17.12.2011    source источник
comment
Я не парень Maven, поэтому я понятия не имею, как это исправить, но я могу, по крайней мере, сказать, что исключение указывает на то, что у вас есть несколько файлов JAR EL API в конечном пути к классам времени выполнения веб-приложения (конфликтующий класс принадлежит пакету javax.el) . Если вы уверены, что Maven выполняет свою работу правильно, вам необходимо проверить, не вручную вы разместили что-либо в /WEB-INF/lib, Tomcat/lib, JRE/lib, JRE/lib/ext и любом другом пути, который покрывается веб-приложением. путь к классам среды выполнения. Tomcat 7 поставляется сам по себе с правильным API / impl EL 2.2, поэтому вам не нужно предоставлять его самостоятельно (или через Maven).   -  person BalusC    schedule 17.12.2011
comment
@BalusC, значит, вы имеете в виду, что я должен удалить зависимость, которая помечена как предоставленная, и включить только jsp-api и servlet-api, как указано?   -  person Mahmoud Saleh    schedule 17.12.2011
comment
Как уже было сказано, я не парень из Maven. Я понятия не имею. Вам необходимо проверить, все ли в порядке с WAR, созданным Maven, и не загромождали ли вы вручную вышеупомянутые пути к библиотекам дублированными файлами JAR EL API.   -  person BalusC    schedule 17.12.2011
comment
Я также рекомендовал бы перейти на Eclipse 3.7.1 (Indigo), поскольку это последняя стабильная версия Eclipse.   -  person Alexander Pogrebnyak    schedule 17.12.2011
comment
@Alexander Pogrebnyak, я даже попытался удалить все зависимости из .m2 и полностью очистить и установить maven, но все еще получаю ту же ошибку и подсказки для причины ошибки?   -  person Mahmoud Saleh    schedule 21.12.2011
comment
Попробуйте установить ‹version› для deps, точно совпадающих с таковыми в Tomcat 7. Попробуйте ‹scope› system ‹/scope›.   -  person Vadzim    schedule 22.12.2011
comment
@Vadzim, вы хотите добавить javax.servlet.jsp-api, javax.el-api в качестве системы прицеливания? что означает система прицела и как узнать точные версии для каждой банки в Tomcat 7?   -  person Mahmoud Saleh    schedule 22.12.2011
comment
См. Также stackoverflow.com/questions/1031695/. Но это до сих пор не дает ответа, почему в вашем случае при условии, что депс ввязались в войну.   -  person Vadzim    schedule 22.12.2011


Ответы (2)


Вы должны добавлять эти зависимости только в том случае, если они вам требуются в вашем коде, что означает, что они необходимы для компиляции вашего кода. Если вы не используете классы JSP или EL в своем коде, вы можете удалить зависимости. Таким образом, вы можете проверить, нужны ли вам зависимости, просто удалив их. Если ваш код все еще компилируется, они вам не нужны. :)

Если они вам нужны, вы обязательно должны добавить их как provided зависимости, потому что классы предоставляются Tomcat во время выполнения. Просто убедитесь, что версии зависимостей соответствуют версиям, предоставленным Tomcat. Тогда у вас не будет проблем. Предоставленные зависимости используются только для компиляции вашего кода, но они не упаковываются в итоговый файл WAR, что нормально, потому что Tomcat предоставляет их.

person chkal    schedule 14.01.2012

У меня была аналогичная проблема: я смог запустить проект на одном компьютере, но на другом я получал ClassNotFoundException, описанный в вопросе.

Единственная разница между двумя средами заключалась в версии сервера tomcat: 7.0.26 на рабочем компьютере и 7.0.16 на другом. Я установил одну и ту же версию на оба компьютера (7.0.26), и проблема была решена.

Надеюсь, этот ответ может быть кому-то полезен.

person eternay    schedule 17.09.2012