2011-12-17 14 views
5

dopo l'aggiornamento alla versione più recente di Eclipse Helios 3.6, M2E 1.0, WTP 3.2.5 e cercando di eseguire il mio Maven progetto che utilizza JSF 2.1.3 e Spring 3 su Tomcat 7, io sono sempre la seguente eccezione:

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 

seguente è m Configurazione y per 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> 

mi manca un file JAR, o utilizzando una versione non compatibile di un vaso?

Si prega di avvisare, grazie.

UPDATE: ciò che ho finora è che ottengo l'applicazione per funzionare bene, eliminando le seguenti dipendenze da file 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> 

penso che essi sono stati in conflitto con i vasi forniti dal contenitore.

Che cosa ho bisogno di sapere:

1- Devo aggiungere le dipendenze: javax.servlet.jsp-api, javax.el-api al mio file pom come previsto o non ho bisogno di aggiungere loro a tutti?

2- Se devo aggiungere queste due dipendenze, allora come dovrei aggiungerle correttamente in modo che non entrino in conflitto con i jar di tomcat, ovvero quale versione, e dovrei contrassegnare la dipendenza come fornita o no?

e la domanda importante se devo aggiungerli, perché devo farlo, qual è l'importanza di aggiungerli poiché sono forniti dal contenitore, quello che ho capito finora, è che ho bisogno di aggiungere il Dipendenza javax.servlet-api e contrassegnarla come fornita dal momento che sto utilizzando le servlet in alcune classi.

+3

Io non sono un ragazzo Maven, quindi non ho idea di come risolvere questo problema, ma posso almeno dire che l'eccezione indica che hai più file JAR di API EL nel percorso di classe di runtime finale dell'app Webapp (la classe in conflitto è di pacchetto 'javax.el'). Se sei certo che Maven stia facendo bene il suo lavoro, allora devi verificare se non hai * manualmente * inserito nulla in '/ WEB-INF/lib',' Tomcat/lib', 'JRE/lib', 'JRE/lib/ext' e qualsiasi altro percorso che è coperto dal classpath di runtime di webapp. Tomcat 7 viene fornito già con l'API/IP EL 2.2 giusto, quindi non è necessario fornirlo (o da Maven). – BalusC

+0

@BalusC quindi vuoi dire che dovrei rimuovere la dipendenza el che è contrassegnata come fornita e includere solo jsp-api e servlet-ap come fornito? –

+0

Come detto, non sono un ragazzo Maven. Non ne ho idea. È necessario verificare se la WAR di Maven è a posto e se non si dispone di troppi percorsi della libreria sopra menzionati con i file JAR dell'IP EL duplicati. – BalusC

risposta

2

È necessario aggiungere queste dipendenze solo se sono richieste nel codice, il che significa che sono obbligate a compilare il codice. Se non si utilizzano classi JSP o EL nel codice, è possibile rimuovere le dipendenze. Quindi puoi testare se hai bisogno delle dipendenze semplicemente rimuovendole. Se il tuo codice è ancora compilato, non ne hai bisogno. :)

Se sono necessari, è necessario aggiungerli come dipendenze provided poiché le classi vengono fornite da Tomcat durante il runtime. Assicurati che le versioni delle dipendenze corrispondano alle versioni fornite da Tomcat. Allora non avrai problemi. Le dipendenze fornite sono utilizzate solo per compilare il codice ma non sono impacchettate nel file WAR risultante, il che è OK, perché Tomcat fornisce loro.

1

Ho avuto un problema simile: ero in grado di eseguire un progetto in un computer, ma in un altro, stavo ottenendo l'eccezione ClassNotFoundException descritta nella domanda.

L'unica differenza tra i 2 ambienti era la versione del server tomcat: 7.0.26 nel computer funzionante e 7.0.16 nell'altro. Ho installato la stessa versione su entrambi i computer (7.0.26) e ho risolto il problema.

Spero che questa risposta possa essere utile a qualcuno.

Problemi correlati