一尘不染

将RichFaces 3.3.3部署到具有MyFaces 2.2,PrimeFaces,OmniFaces等的Tomcat

tomcat

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

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一起使用

有任何想法吗?


阅读 358

收藏
2020-06-16

共1个答案

一尘不染

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仍会继续加载它。这就是行不通的。

您基本上有3个选择:

  1. 在没有那些通用库的单独的Tomcat实例上部署RichFaces 3.x webapp。

  2. 将那些来自Tomcat的通用库移回到其他Web应用程序中,以便每个Web应用程序都有自己的应用程序。

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

2020-06-16