Jsf weblogic 10.3.4 java.lang.ClassNotFoundException:javax.el.ELContextListener

Jsf weblogic 10.3.4 java.lang.ClassNotFoundException:javax.el.ELContextListener,jsf,weblogic,el,Jsf,Weblogic,El,我有一个JSF1.2应用程序,我打算将其部署到WebLogic10.3.4。在当地的Tomcat环境中,它工作得很好。但是当我尝试将它部署到weblogic时,我在javax.el.ELContextListener上得到了一个ClassNotFoundException。当我添加elapi.jar文件时,我在javax.el.ELResolver上得到一个LinkageError:loader约束冲突。这是一个致命的恶性循环 起初我试图把它当作战争来部署。然后我创建了一个企业项目,以便可以作为

我有一个JSF1.2应用程序,我打算将其部署到WebLogic10.3.4。在当地的Tomcat环境中,它工作得很好。但是当我尝试将它部署到weblogic时,我在
javax.el.ELContextListener
上得到了一个
ClassNotFoundException
。当我添加
elapi.jar
文件时,我在
javax.el.ELResolver
上得到一个
LinkageError:loader约束冲突
。这是一个致命的恶性循环

起初我试图把它当作战争来部署。然后我创建了一个企业项目,以便可以作为EAR进行部署,但它并没有解决问题。我的EAR文件结构很好

首先我得到了下面的错误

Caused By: java.lang.ClassNotFoundException: javax.el.ELContextListener
    at weblogic.utils.classloaders.GenericClassLoader.findLocalClass(GenericClassLoader.java:297)
    at weblogic.utils.classloaders.GenericClassLoader.findClass(GenericClassLoader.java:270)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
    at weblogic.utils.classloaders.GenericClassLoader.loadClass(GenericClassLoader.java:179)
当我将
el-api-2.2.jar
添加到WAR的
/WEB-INF/lib
或EAR的
/APP-INF/lib
中时,我得到加载程序常量错误

com.sun.faces.config.ConfigureListener failed: java.lang.LinkageError: loader constraint violation: when resolving interface method "javax.servlet.jsp.JspApplicationContext.addELResolver(Ljavax/el/ELResolver;)V" the class loader (instance of weblogic/utils/classloaders/GenericClassLoader) of the current class, com/sun/faces/config/ConfigureListener, and the class loader (instance of sun/misc/Launcher$AppClassLoader) for resolved class, javax/servlet/jsp/JspApplicationContext, have different Class objects for the type javax/el/ELResolver used in the signature.
java.lang.LinkageError: loader constraint violation: when resolving interface method "javax.servlet.jsp.JspApplicationContext.addELResolver(Ljavax/el/ELResolver;)V" the class loader (instance of weblogic/utils/classloaders/GenericClassLoader) of the current class, com/sun/faces/config/ConfigureListener, and the class loader (instance of sun/misc/Launcher$AppClassLoader) for resolved class, javax/servlet/jsp/JspApplicationContext, have different Class objects for the type javax/el/ELResolver used in the signature
    at com.sun.faces.config.ConfigureListener.registerELResolverAndListenerWithJsp(ConfigureListener.java:582)
    at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:212)
有什么问题吗?我改变了我的类路径顺序,但结果是一样的。我的
web.xml
声明为Servlet 2.5,我在
/web-INF/lib
中有以下JAR:

  • commons-beanutils-1.7.0.jar
  • commons-collections-3.2.jar
  • commons-digester-1.8.jar
  • commons-logging-1.0.4.jar
  • 深色-3.3.3.Final.jar
  • glassX-3.3.3.Final.jar
  • jsf-api.jar
  • jsf-impl.jar
  • jstl-1.2.jar
  • 拉古纳-3.3.3.Final.jar
  • log4j-1.2.14.jar
  • poi-3.7-20101029.jar
  • 石英-all-1.8.4.jar
  • richfaces-api-3.3.3.Final.jar
  • richfaces-impl-3.3.3.Final.jar
  • richfaces-ui-3.3.3.Final.jar
  • scjd12.jar
  • slf4j-api-1.6.0.jar
  • slf4j-log4j12-1.6.0.jar
  • 主题-3.3.3.Final.jar

您可以尝试使用过滤类加载器。 weblogic-application.xml文件可以包括以下内容:

  <prefer-application-packages>
    <package-name>javax.faces.*</package-name>
    <package-name>com.sun.faces.*</package-name>
    <package-name>org.apache.myfaces.*</package-name>
   </prefer-application-packages>

javax.faces*
com.sun.faces*
org.apache.myfaces*
这使得WebLogic的过滤类加载器能够阻止应用程序在容器中看到JSF(本例中是javax.faces和myfaces部分)。您需要将依赖于库的所有内容也保留在应用程序类加载器中,这就是我在本例中使用facelets的原因。
希望这对您有所帮助。

如果即使您做了与el JAR相关的所有必要更改(我的意思是更喜欢weblogic-application.xml中的应用程序包和其他内容等),您仍然会遇到此错误,我认为您的web.xml文件中有问题。 请检查web.xml中是否有以下行

  <context-param>
    <param-name>com.sun.faces.expressionFactory</param-name>
    <param-value>com.sun.el.ExpressionFactoryImpl</param-value>
  </context-param>

com.sun.faces.expressionFactory
com.sun.el.ExpressionFactoryImpl

我终于找到了解决方案

jsf impljar包括“ELContextListenerImpl”类,该类实现“ELContextListener”接口。ELContextListener接口包含在服务器路径中的wlfullclient-10.3.X.jar

如果服务器路径中没有wlfullclient jar,则会出现“ClassNotFoundException:javax.el.ELContextListener”错误。获取此错误如果您这次添加el api jar,您将获得“LinkageError:loader约束冲突”,因为您使用的jar版本与服务器的jar版本不同。无论如何,在weblogic服务器中创建wlfullclient-10.3.X.jar后,问题将得到解决


为了创建这个jar,您可以阅读以下帖子:

您在本地使用的是什么容器?
web.xml
声明的Servlet版本是什么?您在
/WEB-INF/lib
中有哪些JAR文件?您好,巴卢斯克,我知道您会回答:)首先非常感谢。我在本地使用ApacheTomcat。我的web.xml版本是2.5,我的Jar文件inf web inf/lib是;commons-beanutils-1.7.0.jar commons-collections-3.2.jar commons-digester-1.8.jar commons-logging-1.0.4.jar darkX-3.3.Final.jar glassX-3.3.3.Final.jar jsf-jsf-api.jar jsf-impl.jar jstl-1.2.jar laguna-3.3.3.Final.jar log4j-1.2.14.jar poi-3.7-20101029.jar quartz-all-1.8.4.jar richfaces-3.3.3.3.3.jar-Finalrichfaces-ui-3.3.Final.jar scjd12.jar slf4j-api-1.6.0.jar slf4j-log4j12-1.6.0.jar主题-3.3.3.Final.jar这里有一个粗略的猜测。您(或其中一个JAR)依赖于比WebLogic 10.3.4更新的EL版本。他们需要ElContextListener,但WebLogic没有。第一个堆栈跟踪中是否还有更多?如果是这样,它可能会显示谁注意到了它。@Mustafa:Weblogic已经附带了JSF/JSTL。它可能发生了碰撞。在导出之前,请尝试从
/WEB-INF/lib
中删除它们。我不会把这篇文章作为答案,因为我不确定根本原因,因此无法解释这个问题。我不使用Weblogic,我以前也没见过。让我知道它是否有效,然后我会把它作为一个答案重新发布@Ed Staub:ELContextListener
是Servlet2.5/JSP2.1的一部分。Weblogic 10.3.4是一个与Servlet 2.5兼容的容器。所以它一定有了。@BalusC谢谢你的回复。我照你说的做了,但不幸的是没用。它抛出“java.lang.IllegalStateException:应用程序在启动时未正确初始化,无法在javax.faces.FactoryFinder$FactoryManager.getFactory中找到工厂:javax.faces.context.FacesContextFactory(FactoryFinder.java:725)谷歌搜索了一下之后,我将com.sun.faces.config.ConfigureListener添加到我的web.xml中,这次它抛出了“ClassNotFoundException:javax.el.ELContextListener”Hi Baatar感谢您的回复。实际上,我放弃了迁移到更高版本。但我认为你的回答会有帮助。我以后会考虑你的答案。非常感谢你。