Winstone: could not find Factory: javax.faces.context.FacesContextFactory

1.6k views Asked by At

I'm not able to publish JSF2 application on Winstone server.

Server is configured fine and when I remove

<load-on-startup>1</load-on-startup>

from web.xml, it starts normally:

enter image description here

But when I try to start indew.xhtml, server reports:

enter image description here

Part of my web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xmlns="http://java.sun.com/xml/ns/javaee" 
         xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
         id="WebApp_ID" version="2.5">
  <display-name>PIA</display-name>
  <session-config>
    <session-timeout>60</session-timeout>
  </session-config>
  <welcome-file-list>
    <welcome-file>index.xhtml</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
  </servlet-mapping>

  <context-param>
    <description>State saving method: 'client' or 'server'.</description>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>client</param-value>
  </context-param>
  <context-param>
    <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
    <param-value>resources.application</param-value>
  </context-param>
  <context-param>
    <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
    <param-value>.xhtml</param-value>
  </context-param>
</web-app>

Update: I've tried winstone 1.0.0.jar and it reports this:

enter image description here

But I have slf4j-api-1.6.4.jar and slf4j-log4j12-1.6.4.jar in my WEB-INF\lib folder... Where should be a problem?

1

There are 1 answers

8
BalusC On BEST ANSWER

Add this to your web.xml to explicitly register the listener which is supposed to configure the JSF factories.

<listener>
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
</listener>

Another possible solution is to remove the <load-on-startup> from the FacesServlet, but I have never used Winstone so I can't guarantee if that would work on that server.

This workaround is usually not mandatory in decent servers, but in poor servers it is. For more background information, see also could not find Factory: javax.faces.context.FacesContextFactory.


Update as per the comments, after adding the listener the exception disappeared, but now a Error instantiating listener class: com.sun.faces.config.ConfigureListener appears without any stacktrace. The swallowing of the stacktrace seems to be a Winstone bug which was fixed in 1.0.0. Give it a try, it should now show the real cause of the problem.


Update 2 as per the question update, the real cause seems to be a NoClassDefFoundError on org.slf4j.loggerFactory. This is however not used by Mojarra in any way. The stacktrace also indicates that this is happening before loading any listeners. In other words, this is likely a different problem, releated to Winstone. Apparently Winstone itself needs that library. Add it to the runtime classpath of Winstone instead of the /WEB-INF/lib.