将RichFaces 3.3.3部署到具有MyFaces 2.2,PrimeFaces,OmniFaces等的Tomcat [英] Deploying RichFaces 3.3.3 to Tomcat having MyFaces 2.2, PrimeFaces, OmniFaces etc

查看:110
本文介绍了将RichFaces 3.3.3部署到具有MyFaces 2.2,PrimeFaces,OmniFaces等的Tomcat的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下配置(不要被堆栈跟踪吓到了:))

I have the following configuration ( don't get scared by the stack traces :) )

Tomcat 7.0.53 +我们所有的jar(包括MyFaces 2.2.3/Omnifaces/PrimeFaces/etc ...)都位于Web应用程序之外(不在web-inf \ lib内部,而是在其他路径Tomcat \中) someName \ lib ...,并通过common.loader从catalina.properties文件引用).此设置可以很好地为我们所有的Web应用服务,但一个使用RichFaces 3.3.3的旧版Web应用除外-RichFaces罐子位于该特定的Webapp lib文件夹中,(在使用MyFaces 2.0.11时效果很好),但是现在切换到MyFaces 2.2.3之后,出现了以下异常

Tomcat 7.0.53 + All our jars - including MyFaces 2.2.3 / Omnifaces / PrimeFaces / etc...) are located apart of the web apps (not inside web-inf\lib , but inside the other path Tomcat\someName\lib... and are referenced from catalina.properties file with the common.loader) this setup serves all our webapps just fine, except one legacy webapp that is using RichFaces 3.3.3 - RichFaces jars are in that specific webapp lib folder, (which worked just fine while we were using MyFaces 2.0.11) but now after switching to the MyFaces 2.2.3 I'm getting the following exception

java.lang.NoClassDefFoundError:com/sun/facelets/tag/jsf/ComponentHandler 在java.lang.ClassLoader.defineClass1(本机方法) 在java.lang.ClassLoader.defineClass(ClassLoader.java:800) 在java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)

java.lang.NoClassDefFoundError: com/sun/facelets/tag/jsf/ComponentHandler at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:800) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)

...

原因:java.lang.ClassNotFoundException:com.sun.facelets.tag.jsf.ComponentHandler 在org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720) 在org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571) 在org.apache.tomee.catalina.LazyStopWebappClassLoader.loadClass(LazyStopWebappClassLoader.java:143) ...还有64个

Caused by: java.lang.ClassNotFoundException: com.sun.facelets.tag.jsf.ComponentHandler at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571) at org.apache.tomee.catalina.LazyStopWebappClassLoader.loadClass(LazyStopWebappClassLoader.java:143) ... 64 more

而且似乎因为facelets软件包在2.0和2.2之间发生了变化

And it seems because of facelets packages changes between 2.0 and 2.2

所以我尝试将jsf-facelets-1.1.14.jar放到该webapp lib文件夹中,并得到以下异常

So I tried dropping jsf-facelets-1.1.14.jar to that webapp lib folder and got the following exception

javax.faces.FacesException:无法实例化TagLibrary 在org.apache.myfaces.view.facelets.compiler.TagLibraryConfig.create(TagLibraryConfig.java:424) 在org.apache.myfaces.view.facelets.compiler.FaceletsCompilerSupport.loadLibraries(FaceletsCompilerSupport.java:157) 在org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.loadLibraries(FaceletViewDeclarationLanguage.java:2520)

javax.faces.FacesException: Cannot instantiate TagLibrary at org.apache.myfaces.view.facelets.compiler.TagLibraryConfig.create(TagLibraryConfig.java:424) at org.apache.myfaces.view.facelets.compiler.FaceletsCompilerSupport.loadLibraries(FaceletsCompilerSupport.java:157) at org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.loadLibraries(FaceletViewDeclarationLanguage.java:2520)

...

在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:615) 在java.lang.Thread.run(Thread.java:745) 原因:java.lang.Exception:com.sun.facelets.tag.jsf.core.CoreLibrary必须是org.apache.myfaces.view.facelets.tag.TagLibrary的实例 在org.apache.myfaces.view.facelets.compiler.TagLibraryConfig.createClass(TagLibraryConfig.java:542) 在org.apache.myfaces.view.facelets.compiler.TagLibraryConfig.create(TagLibraryConfig.java:419) ...另外50个

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745) Caused by: java.lang.Exception: com.sun.facelets.tag.jsf.core.CoreLibrary must be an instance of org.apache.myfaces.view.facelets.tag.TagLibrary at org.apache.myfaces.view.facelets.compiler.TagLibraryConfig.createClass(TagLibraryConfig.java:542) at org.apache.myfaces.view.facelets.compiler.TagLibraryConfig.create(TagLibraryConfig.java:419) ... 50 more

因此,现在我尝试将myfaces-impl-2.0.11和myfaces-api-2.0.11拖放到该webapp lib文件夹中,但是现在该webapp甚至没有被Tomcat部署,并且引发了与OmniFaces有关的异常(甚至没有被该Web应用使用,并且在该处的任何地方都没有提及)

So now I tried to drop the myfaces-impl-2.0.11 and myfaces-api-2.0.11 to that webapp lib folder , but now the webapp insn't even being deployed by Tomcat and throwing exception regarding OmniFaces (which is not even used by that webapp and not mentioned anywhere there)

[2014-08-28 09:36:12,645 IDT] E 000001b4(org.apache.myfaces.webapp.AbstractFacesInitializer#initFaces)初始化MyFaces时发生错误:类org.omnifaces.application.OmniApplicationFactory是不 javax.faces.application.ApplicationFactory java.lang.IllegalArgumentException:类org.omnifaces.application.OmniApplicationFactory不是javax.faces.application.ApplicationFactory 在javax.faces.FactoryFinder.newFactoryInstance(FactoryFinder.java:320) 在javax.faces.FactoryFinder._getFactory(FactoryFinder.java:286) 在javax.faces.FactoryFinder.getFactory(FactoryFinder.java:191) 在org.apache.myfaces.config.FacesConfigurator.configureApplication(FacesConfigurator.java:500) 在org.apache.myfaces.config.FacesConfigurator.configure(FacesConfigurator.java:411) 在org.apache.myfaces.webapp.AbstractFacesInitializer.buildConfiguration(AbstractFacesInitializer.java:337) 在org.apache.myfaces.webapp.Jsp21FacesInitializer.initContainerIntegration(Jsp21FacesInitializer.java:73)中 在org.apache.myfaces.webapp.AbstractFacesInitializer.initFaces(AbstractFacesInitializer.java:140) 在org.apache.myfaces.webapp.StartupServletContextListener.contextInitialized(StartupServletContextListener.java:111) 在org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4973) 在org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5467) 在org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 在org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901) 在org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877) 在org.apache.catalina.core.StandardHost.addChild(StandardHost.java:632) 在org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1073) 在org.apache.catalina.startup.HostConfig $ DeployWar.run(HostConfig.java:1857) 在java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:471) 在java.util.concurrent.FutureTask.run(FutureTask.java:262) 在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:615) 在java.lang.Thread.run(Thread.java:745)

[2014-08-28 09:36:12,645 IDT] E 000001b4 (org.apache.myfaces.webapp.AbstractFacesInitializer#initFaces) An error occured while initializing MyFaces: Class org.omnifaces.application.OmniApplicationFactory is no javax.faces.application.ApplicationFactory java.lang.IllegalArgumentException: Class org.omnifaces.application.OmniApplicationFactory is no javax.faces.application.ApplicationFactory at javax.faces.FactoryFinder.newFactoryInstance(FactoryFinder.java:320) at javax.faces.FactoryFinder._getFactory(FactoryFinder.java:286) at javax.faces.FactoryFinder.getFactory(FactoryFinder.java:191) at org.apache.myfaces.config.FacesConfigurator.configureApplication(FacesConfigurator.java:500) at org.apache.myfaces.config.FacesConfigurator.configure(FacesConfigurator.java:411) at org.apache.myfaces.webapp.AbstractFacesInitializer.buildConfiguration(AbstractFacesInitializer.java:337) at org.apache.myfaces.webapp.Jsp21FacesInitializer.initContainerIntegration(Jsp21FacesInitializer.java:73) at org.apache.myfaces.webapp.AbstractFacesInitializer.initFaces(AbstractFacesInitializer.java:140) at org.apache.myfaces.webapp.StartupServletContextListener.contextInitialized(StartupServletContextListener.java:111) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4973) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5467) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:632) at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1073) at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1857) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) at java.util.concurrent.FutureTask.run(FutureTask.java:262) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745)

我认为可以混合使用两种不同的JSF版本(但是我可能错了),也许有更好的解决方案可以使Richfaces 3.3.3与JSF 2.2.3一起使用

I thought that it is possible to mix two different JSF versions (but I might be wrong) and maybe there is a better solution to make that Richfaces 3.3.3 work with JSF 2.2.3

有什么想法吗?

推荐答案

RichFaces 3.x与JSF 2.2不兼容. Tomcat不支持隔离的JSF类加载,例如在web.xml中具有org.jboss.jbossfaces.WAR_BUNDLES_JSF_IMPL上下文参数的JBoss,在glassfish-web.xml中具有<property name="useBundledJsf" value="true" />的GlassFish等.因此,即使通过Web应用程序提供另一个JSF版本,Tomcat仍会继续加载自己的.这就是行不通的.

RichFaces 3.x is not compatible with JSF 2.2. Tomcat does not support isolated JSF class loading such as JBoss with org.jboss.jbossfaces.WAR_BUNDLES_JSF_IMPL context param in web.xml, GlassFish with <property name="useBundledJsf" value="true" /> in glassfish-web.xml, etc. So even when you supply another JSF version via the webapp, Tomcat keeps loading its own. This just can't work.

您基本上有3个选择:

  1. 将该RichFaces 3.x Web应用程序部署在没有这些公共库的单独的Tomcat实例上.

  1. Deploy that RichFaces 3.x webapp on a separate Tomcat instance without those common libs.

从Tomcat中将这些常见的库移回其他Web应用程序中,以便每个Web应用程序都有自己的应用程序.

Move those common libs from Tomcat back in those other webapps, so each webapp gets its own.

升级到RichFaces4.x.到那里去做,这样做,他们有一个很好的迁移指南.

Upgrade to RichFaces 4.x. Been there, done that, they've a quite good migration guide.

这篇关于将RichFaces 3.3.3部署到具有MyFaces 2.2,PrimeFaces,OmniFaces等的Tomcat的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆