我正在尝试在Tomcat 6 Web服务器上使用Apache MyFaces 2.1.7运行JSF 2.0 Webapp。该应用程序使用Tomahawk 1.1.11和表达语言2.2(el-impl-2.2.jar)。为此,我将myfaces-api和myfaces-impl放入Tomcats lib文件夹中,并将Tomcats el-api.jar交换为2.2变体。
当我调用应用程序的第一页时,总是会收到错误消息:
java.lang.IllegalStateException: No Factories configured for this Application. This
happens if the faces-initialization does not work at all - make sure that you properly
include all configuration settings necessary for a basic faces application and that all
the necessary libs are included. Also check the logging output of your web application
and your container for any exceptions!
If you did that and find nothing, the mistake might be due to the fact that you use
some special web-containers which do not support registering context-listeners via TLD
files and a context listener is not setup in your web.xml.
A typical config looks like this;
<listener>
<listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
</listener>
javax.faces.FactoryFinder._getFactory(FactoryFinder.java:286)
javax.faces.FactoryFinder.getFactory(FactoryFinder.java:206)
javax.faces.webapp.FacesServlet.init(FacesServlet.java:116)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
java.lang.Thread.run(Thread.java:679)
我肯定在我的
web.xml
中提到了xml片段。我尝试调试代码,发现registeredFactoryNames
的第267行的javax.faces.FactoryFinder
为空,这会导致错误。但是,我不明白为什么会这样。里面应该有什么?我该如何到达那里?有趣的是,Webapp可以使用嵌入式码头8完美运行。因此,这一定是一些依赖问题。
希望对这一切有更深入了解的人在这里对我有所帮助。
最佳答案
好
我发现了问题。该错误是由于在类路径上两次放置了myfaces-api.jar而导致的。所以对我来说,问题是我将myfaces-api.jar放在了tomcat的lib文件夹和webapp的WEB-INF / lib文件夹中。
在将嵌入式tomcat与maven一起使用时,我在整个应用程序的依赖项以及带有范围编译功能的tomcat6-maven-plugin的依赖项中拥有myfaces-api.jar。我将范围从编译更改为全局依赖项部分中提供的范围,并且可以正常工作。