我有一个JSF 1.2应用程序,我打算将它部署到Weblogic 10.3.4。在本地Tomcat环境下,它可以正常工作。但是当我尝试将其部署到weblogic时,我在javax.el.ELContextListener
上获得ClassNotFoundException
。当我添加el-api.jar
文件,然后我得到javax.EL.ELResolver
上的LinkageError: loader constraint violation
。这是一个致命的恶性循环。
起初我试图将其部署为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
时,我会得到加载器约束错误;
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
- darkX-3.3.3.Final.jar
- glassX-3.3.3.Final.jar
- 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-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
- themes-3.3.3.Final.jar
您可以尝试使用过滤类加载器。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的过滤类加载器能够阻止应用程序在容器(javax. js . js)中看到JSF。Faces和myfaces(在本例中是一部分)。你需要把所有依赖于你的库的东西也放在你的应用程序类加载器中,这就是为什么我在这个例子中有facelets。
如果你仍然得到这个错误,即使你做了所有必要的变化相关的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>
我终于找到了解决办法。
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/