jsf - java.lang.IllegalArgumentException : javax. faces.lifecycle.ClientWindowFactory

标签 jsf tomcat jsf-2 mojarra

我们一直在开发服务器上运行一个 Web 应用程序,最近有人为我们构建了一个生产服务器(据称)具有完全相同的 tomcat 配置,包括/lib 目录中的 JSF 库。当我尝试部署我的应用程序时,新服务器会抛出一条相当令人困惑的错误消息,我希望能得到一些帮助理解。

catalina.out

到目前为止,生产日志和开发日志看起来都很相似:

24-Jun-2015 13:16:47.880 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive /opt/fleetforecaster/ff-tomcat/webapps/ROOT.war
24-Jun-2015 13:16:47.903 WARNING [localhost-startStop-1] org.apache.catalina.startup.SetContextPropertiesRule.begin [SetContextPropertiesRule]{Context} Setting property 'antiJARLocking' to 'true' did not find a matching property.
24-Jun-2015 13:16:47.911 WARNING [localhost-startStop-1] org.apache.tomcat.util.digester.SetPropertiesRule.begin [SetPropertiesRule]{Context/Realm} Setting property 'debug' to '99' did not find a matching property.
24-Jun-2015 13:16:52.059 INFO [localhost-startStop-1] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
24-Jun-2015 13:16:52.180 INFO [localhost-startStop-1] null.null Initializing Mojarra 2.2.5 ( 20140108-1427 https://svn.java.net/svn/mojarra~svn/tags/2.2.5@12761) for context ''
24-Jun-2015 13:16:52.401 INFO [localhost-startStop-1] null.null JSF1048: PostConstruct/PreDestroy annotations present.  ManagedBeans methods marked with these annotations will have said annotations processed.
24-Jun-2015 13:16:52.429 SEVERE [localhost-startStop-1] null.null Unknow type constant pool 18 at position 20
24-Jun-2015 13:16:52.430 SEVERE [localhost-startStop-1] null.null Unknow type constant pool 0 at position 21
24-Jun-2015 13:16:52.431 SEVERE [localhost-startStop-1] null.null Unknow type constant pool 0 at position 22
24-Jun-2015 13:16:52.435 SEVERE [localhost-startStop-1] null.null Unknow type constant pool 18 at position 63
24-Jun-2015 13:16:52.436 SEVERE [localhost-startStop-1] null.null Unknow type constant pool 0 at position 64
24-Jun-2015 13:16:52.437 SEVERE [localhost-startStop-1] null.null Unknow type constant pool 0 at position 65

此时产品服务器开始抛出错误:

24-Jun-2015 13:16:52.606 SEVERE [localhost-startStop-1] null.null Critical error during deployment:
 com.sun.faces.config.ConfigurationException: CONFIGURATION FAILED! javax.faces.lifecycle.ClientWindowFactory
    at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:449)
    at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:214)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4727)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5167)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717)
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:945)
    at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1768)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.IllegalArgumentException: javax.faces.lifecycle.ClientWindowFactory
    at javax.faces.FactoryFinder.validateFactoryName(FactoryFinder.java:674)
    at javax.faces.FactoryFinder.setFactory(FactoryFinder.java:368)
    at com.sun.faces.config.processor.FactoryConfigProcessor.setFactory(FactoryConfigProcessor.java:317)
    at com.sun.faces.config.processor.FactoryConfigProcessor.processFactories(FactoryConfigProcessor.java:274)
    at com.sun.faces.config.processor.FactoryConfigProcessor.process(FactoryConfigProcessor.java:216)
    at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:435)
    ... 14 more

后跟第二个错误 block :

24-Jun-2015 13:16:52.609 SEVERE [localhost-startStop-1] org.apache.catalina.core.StandardContext.startInternal One or more listeners failed to start. Full details will be found in the appropriate container log file
24-Jun-2015 13:16:52.621 SEVERE [localhost-startStop-1] org.apache.catalina.core.StandardContext.startInternal Context [] startup failed due to previous errors
24-Jun-2015 13:16:52.628 SEVERE [localhost-startStop-1] null.null Application was not properly initialized at startup, could not find Factory: javax.faces.application.ApplicationFactory. Attempting to find backup.
24-Jun-2015 13:16:52.628 SEVERE [localhost-startStop-1] null.null Unexpected exception when attempting to tear down the Mojarra runtime
 java.lang.IllegalStateException: Could not find backup for factory javax.faces.application.ApplicationFactory.
    at javax.faces.FactoryFinder$FactoryManager.getFactory(FactoryFinder.java:1011)
    at javax.faces.FactoryFinder.getFactory(FactoryFinder.java:343)
    at com.sun.faces.config.InitFacesContext.getApplication(InitFacesContext.java:142)
    at com.sun.faces.config.ConfigureListener.contextDestroyed(ConfigureListener.java:310)
    at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:4774)
    at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5390)
    at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:232)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:160)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717)
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:945)
    at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1768)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

两台服务器(据我所知)配置相同 - 它们在/lib 目录中有 2 个用于 JSF 和 JSTL 的附加库。

知道这些错误消息的含义吗?我必须假设它与 tomcat 安装有关,因为完全相同的 war 在一台服务器上运行良好,但在另一台服务器上则不然。

还有一行内容是:

    24-Jun-2015 13:16:52.609 SEVERE [localhost-startStop-1] org.apache.catalina.core.StandardContext.startInternal One or more listeners failed to start. Full details will be found in the appropriate container log file

我到底在哪里可以找到“适当的容器日志文件”

两台服务器 - tomcat/lib

jsf-api-2.1.7.jar jsf-impl-2.1.7.jar

两台服务器 - WEB-INF/lib

atmosphere-runtime-2.3.0.jar
commons-codec-1.5.jar
commons-fileupload-1.3.1.jar
commons-io-2.2.jar
commons-lang-2.6.jar
commons-logging-1.2.jar
dom4j-1.6.1.jar
javaee-web-api-7.0.jar
javax.faces-2.2.5.jar
javax.inject-1.jar
javax.servlet-api-3.0.1.jar
joda-time-2.3.jar
jsf-api-2.1.13.jar
jsf-impl-2.1.13.jar
jstl-1.2.jar
mysql-connector-java-5.1.30.jar
poi-3.10-FINAL.jar
poi-ooxml-3.9.jar
poi-ooxml-schemas-3.9.jar
primefaces-5.1.jar
slf4j-api-1.7.7.jar
stax-api-1.0.1.jar
trove4j-3.0.3.jar
xml-apis-1.0.b2.jar
xmlbeans-2.3.0.jar

最佳答案

Web 应用程序的运行时类路径一团糟。

删除/WEB-INF/lib 中的那些 JAR

  • javaee-web-api-7.0.jar
  • javax.faces-2.2.5.jar
  • javax.servlet-api-3.0.1.jar

第一个旨在用于编译针对 Java EE 7 容器的 WAR/EAR。它不打算与针对准系统 JSP/Servlet 容器(如 Tomcat)的 WAR 一起安装。它会感到困惑并认为它实际上是一个 Java EE 7 容器(哦,太高兴了)。

第二个是 Mojarra 2.2.5(API 和 impl 捆绑在单 JAR 风格中),也是您所看到的最初问题的原因。您基本上是针对之前通过 Tomcat 加载的 JSF 2.1 API 加载 JSF 2.2 实现 /libjavax.faces.lifecycle.ClientWindowFactory是自 JSF 2.2 以来的新版本(另请参阅 javadoc 中的 @since ),并且不被 JSF 2.1 API 识别。

第三个应该是 Tomcat 本身已经提供的。请注意,Java EE 7 JAR 还包含 JSF 2.2 和 Servlet 3.1 API。因此,这实际上是 JSF 和 Servlet API 的三重冲突(一个 API 来自 Tomcat 的 /lib ,一个 API 来自 WAR 的 /WEB-INF/lib ,一个 API 来自 Java EE 7 JAR 包;这不好)。

无论如何,我建议也清理 Tomcat 的/lib 并将其保留为默认值。只需坚持 WAR 的/WEB-INF/lib 中的 JAR 即可。而且,如果您实际上打算构建一个 JSF 2.2 目标 Web 应用程序(首先仔细检查 version 中的 faces-config.xml 是否匹配),然后保留在 javax.faces-2.2.5.jar 中。并摆脱那些jsf-api-2.1.13.jarjsf-impl-2.1.13.jar文件。

关于jsf - java.lang.IllegalArgumentException : javax. faces.lifecycle.ClientWindowFactory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31033946/

相关文章:

tomcat - 亚马逊 ec2 网站发布

java - Weblogic 卡住线程 - ArrayList

java - 为什么通知栏不起作用?

java - 迁移到 tomcat 后,将枚举值作为参数从 JSF 页面传递给 bean 方法失败

jquery - ajax 调用后工具提示停止工作

tomcat - Spring 启动 : enable HTTP TRACE method for embedded Tomcat

java - 如何在 Tomcat 容器上运行 .jar?

jsf - 连接在 Facelets 标记的属性中定义的 EL 表达式中的字符串

jsf - 如何使用依赖对象关系更新多个组件(selectOneMenu)?

jsf - 无法找到资源 css、style.css