我有一个JSF 1.2应用程序,我打算将其部署到Weblogic 10.3.4。在本地Tomcat环境中,它工作正常。但是当我尝试将其部署到weblogic时,我在ClassNotFoundException
上获得了javax.el.ELContextListener
。当我添加el-api.jar
文件时,我会在LinkageError: loader constraint violation
上获得javax.EL.ELResolver
。这是一个致命的恶性循环。
起初我尝试将其部署为WAR。然后我创建了一个企业项目,以便我可以部署为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
时,我得到加载程序constarint错误;
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:
答案 0 :(得分:2)
您可以尝试使用过滤类加载器。 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>
这使WebLogic的过滤类加载器能够阻止您的应用程序看到容器中的JSF(在本例中为javax.faces和myfaces部分)。您需要在应用程序类加载器中保留依赖于库的所有内容,这就是我在此示例中使用facelet的原因。 希望这会有所帮助..
答案 1 :(得分:2)
如果您仍然遇到此错误,即使您执行了与el jars相关的所有必要更改(我的意思是更喜欢应用程序包和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>
答案 2 :(得分:0)
最后,我找到了解决方案。
jsf-impl jar包含“ ELContextListenerImpl ”类,该类实现“ ELContextListener ”接口。并且ELContextListener接口包含在服务器路径中的 wlfullclient-10.3.X.jar 中。
如果您在服务器路径中没有wlfullclient jar,则会出现“ ClassNotFoundException:javax.el.ELContextListener ”错误。如果你这次添加el-api jar会出现这个错误,你会得到“ LinkageError:loader constraint violation ”,因为你使用的jar版本和服务器版本不同。无论如何,在weblogic服务器中创建wlfullclient-10.3.X.jar后,问题将得到解决。
为了创建该jar,您可以阅读以下帖子:http://wls4mscratch.wordpress.com/2010/06/19/steps-to-build-a-wlfullclient-jar-in-wls-10-0-x-and-wls-10-3-x/