java.lang.ClassNotFoundException: javax.servlet.jsp.el.ImplicitObjectELResolver $ ImplicitObjects - PullRequest
5 голосов
/ 17 декабря 2011

после обновления до последней версии eclipse Helios 3.6 , M2E 1.0 , WTP 3.2.5 и попытки запустить мой проект maven, который использует JSF 2.1.3 и Spring 3 on 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>

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

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

ОБНОВЛЕНИЕ: чтоя понял, что приложение работает нормально, удалив из файла 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>

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

ЧТО Я ДОЛЖЕН ЗНАТЬ:

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

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

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

Ответы [ 2 ]

2 голосов
/ 14 января 2012

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

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

1 голос
/ 18 сентября 2012

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

Надеюсь, этот ответ кому-нибудь пригодится.

...