tomcat - 将 RichFaces 3.3.3 部署到具有 MyFaces 2.2、PrimeFaces、OmniFaces 等的 Tomcat

标签 tomcat jsf-2 richfaces jsf-2.2 myfaces

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

Tomcat 7.0.53 + 我们所有的 jar - 包括 MyFaces 2.2.3/Omnifaces/PrimeFaces/等等......)位于网络应用程序的一部分(不在 web-inf\lib 内,但在其他路径 Tomcat\someName\lib... 并从带有 common.loader 的 catalina.properties 文件中引用)这个设置很好地服务于我们所有的 webapps,除了一个使用 RichFaces 3.3.3 的遗留 webapps - RichFaces jar 在那个特定的 webapp lib 文件夹中,(当我们使用 MyFaces 2.0.11 时它工作得很好)但现在切换到 MyFaces 2.2.3 后我得到以下异常

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)

...

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 之间发生了变化

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

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)

...

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 的异常(这甚至没有被那个 webapp 使用,也没有在任何地方提到)

[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 一起工作

有什么想法吗?

最佳答案

RichFaces 3.x 与 JSF 2.2 不兼容。 Tomcat 不支持独立的 JSF 类加载,例如带有 org.jboss.jbossfaces.WAR_BUNDLES_JSF_IMPL 的 JBoss web.xml 中的上下文参数, GlassFish 与 <property name="useBundledJsf" value="true" />glassfish-web.xml等。因此,即使您通过 webapp 提供另一个 JSF 版本,Tomcat 也会继续加载它自己的版本。这是行不通的。

您基本上有 3 个选择:

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

  2. 将那些公共(public)库从 Tomcat 移回到那些其他网络应用程序中,这样每个网络应用程序都有自己的。

  3. 升级到 RichFaces 4.x。去过那里,做到了,他们有一个很好的migration guide .

关于tomcat - 将 RichFaces 3.3.3 部署到具有 MyFaces 2.2、PrimeFaces、OmniFaces 等的 Tomcat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25542335/

相关文章:

javascript - 在 PrimeFaces 中更新某些组件时自动调用 javascript

gradle - 使用Gradle设置Richfaces-NLS缺少消息:CANNOT_FIND_FACELET_TAGLIB

java - JVM随机崩溃

jsf-2 - 在 PrimeFaces 图表中使用 jqPlot 插件在图表上绘制线条

jsf-2 - 如何显示默认主页?

javascript - a4j :jsfunction vs calling method directly from javascript

java - Richfaces 3动态列数据表

java - 禁止默认 Servlet 写入权限

java - 在后台在服务器上运行周期性任务

在 heroku 之外部署 Git