我有以下配置(不要被堆栈跟踪吓到了:))
Tomcat 7.0.53 +我们所有的jar(包括MyFaces 2.2.3 / Omnifaces / PrimeFaces等)都位于Web应用程序之外(不在web-inf \ lib内部,而是在其他路径Tomcat \ someName \ lib内部) …,并通过common.loader从catalina.properties文件引用)。此设置可以很好地为我们所有的Web应用提供服务,但一个使用RichFaces 3.3.3的旧版Web应用除外-RichFaces jar位于该特定的Web应用lib文件夹中,(在使用MyFaces 2.0.11时工作正常),但是现在切换到MyFaces 2.2.3之后,出现以下异常
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.ClassNotFoundException: org.apache.catalina.loader.WebappClassLoader.loadClass( com.sun.facelets.tag.jsf.ComponentHandler 在org.apache.catalina.loader.WebappClassLoader处。 org.apache.tomee.catalina.LazyStopWebappClassLoader.loadClass(LazyStopWebappClassLoader.java:143)的loadClass(WebappClassLoader.java:1571)… 64更多
似乎因为facelets软件包在2.0和2.2之间发生了变化
所以我尝试将jsf-facelets-1.1.14.jar放到该webapp lib文件夹中,并得到以下异常
javax.faces.FacesException:无法 在org.apache.myfaces.view.facelets.compiler.FaceletsCompilerSupport.loadLibraries(FaceletsCompilerSupport)上的org.apache.myfaces.view.facelets.compiler.TagLibraryConfig.create(TagLibraryConfig.java:424)处 实例化TagLibrary .java:157),位于org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.loadLibraries(FaceletViewDeclarationLanguage.java:2520)
在java.lang.Thread.run(Thread.java:745)处java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:615)原因 :java.lang.Exception:com.sun.facelets.tag .jsf.core.CoreLibrary必须是org.org.apache.myfaces.view.facelets.compiler.TagLibraryConfig.createClass (TagLibraryConfig.java:542)上org.apache.myfaces.view.facelets.tag.TagLibrary 的实例 。 apache.myfaces.view.facelets.compiler.TagLibraryConfig.create(TagLibraryConfig.java:419)…还有50
因此,现在我尝试将myfaces-impl-2.0.11和myfaces-api-2.0.11拖放到该webapp lib文件夹中,但是现在该webapp甚至没有被Tomcat部署,并且引发了与OmniFaces有关的异常(甚至没有由该webapp使用,并且在此未提及)
[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.FactoryFinder._getFactory(FactoryFinder.java)处的javax.faces.FactoryFinder.newFactoryInstance(FactoryFinder.java:320)上不是javax.faces.application.ApplicationFactory :286)在org.apache.myfaces.config.FacesConfigurator.configure(在org.apache.myfaces.config.FacesConfigurator.configureApplication(FacesConfigurator.java:500)在javax.faces.FactoryFinder.getFactory(FactoryFinder.java:191) FacesConfigurator.java:411),位于org.apache.myfaces.webapp.AbstractFacesInitializer.buildConfiguration(AbstractFacesInitializer.java:337),位于org.apache.myfaces.webapp.Jsp21FacesInitializer.initContainerIntegration(Jsp21FacesInitializer.java:73) .webapp。org.apache.myfaces.webapp.StartupServletContextListener.contextInitialized(StartupServletContextListener.java:111)位于org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4973)处的AbstractFacesInitializer.initFaces(AbstractFacesInitializer.java:140) org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)处的org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5467)org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase .java:901)(位于org.apache.catalina.core.StandardHost.addChild(StandardHost.java:632)位于org.apache.catalina.core.StandardHost.addChild(StandardHost.java:632)处于org.apache.catalina.core.ContainerBase.java:877。 org.apache.catalina.startup上的startup.HostConfig.deployWAR(HostConfig.java:1073)。Java上的HostConfig $ DeployWar.run(HostConfig.java:1857)在java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:471)在java.util.concurrent.FutureTask.run(FutureTask.java:262) .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)运行(Thread.java:745)运行(Thread.java:745)
我认为可以混合使用两种不同的JSF版本(但是我可能错了),也许有更好的解决方案可以使Richfaces 3.3.3与JSF 2.2.3一起使用
有任何想法吗?
RichFaces 3.x与JSF 2.2不兼容。Tomcat不支持隔离的JSF类加载,例如JBoss中的org.jboss.jbossfaces.WAR_BUNDLES_JSF_IMPL上下文参数为in web.xml,GlassFish中的<property name="useBundledJsf" value="true" />in glassfish-web.xml等。因此,即使您通过Web应用程序提供了另一个JSF版本,Tomcat仍会继续加载它。这就是行不通的。
org.jboss.jbossfaces.WAR_BUNDLES_JSF_IMPL
web.xml
<property name="useBundledJsf" value="true" />
glassfish-web.xml
您基本上有3个选择:
在没有那些通用库的单独的Tomcat实例上部署RichFaces 3.x webapp。
将那些来自Tomcat的通用库移回到其他Web应用程序中,以便每个Web应用程序都有自己的应用程序。
升级到RichFaces4.x。到了那里,这样做了,他们有了一个很好的迁移指南。