title: Google App Engine does not parse JSF 2.0 tags
body: <p>I have a problem with running JSF 2.0 on AppEngine. I have following <code>index.xhtml</code> and if I deploy it and open the page, there is nothing but the <strong>Title</strong> and the page's source code is completely the same as it was written - no changes from <code>&lt;h:head&gt;</code> to <code>&lt;head&gt;</code> whatsoever.</p>
  
  <p><code>index.xhtml</code></p>
  
  
  
  <pre class="lang-xml prettyprint-override"><code>&lt;!DOCTYPE html&gt;
  &lt;html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:f="http://java.sun.com/jsf/core"
        xmlns:h="http://java.sun.com/jsf/html"&gt;
  &lt;h:head&gt;
      &lt;title&gt;Title&lt;/title&gt;
  &lt;/h:head&gt;
  &lt;h:body&gt;
      &lt;h:inputText value="Text"/&gt;
  &lt;/h:body&gt;
  &lt;/html&gt;
  </code></pre>
  
  <p><code>appengine-web.xml</code></p>
  
  
  
  <pre class="lang-xml prettyprint-override"><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
  &lt;appengine-web-app xmlns="http://appengine.google.com/ns/1.0"&gt;
      &lt;application&gt;app&lt;/application&gt;
      &lt;version&gt;1&lt;/version&gt;
      &lt;sessions-enabled&gt;true&lt;/sessions-enabled&gt;
      &lt;!-- Configure java.util.logging --&gt;
      &lt;system-properties&gt;
              &lt;property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/&gt;
      &lt;/system-properties&gt;    
  &lt;/appengine-web-app&gt;
  </code></pre>
  
  <p><code>web.xml</code></p>
  
  
  
  <pre class="lang-xml prettyprint-override"><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
  &lt;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"
           version="2.5"&gt;
  &lt;display-name&gt;Task Manager&lt;/display-name&gt;
  &lt;description&gt;Internal task manager&lt;/description&gt;
  
  &lt;!-- Seems like GAE 1.2.6 cannot handle server side session management. 
      At least for JSF 2.0.1 --&gt;
  &lt;context-param&gt;
      &lt;param-name&gt;javax.faces.STATE_SAVING_METHOD&lt;/param-name&gt;
      &lt;param-value&gt;client&lt;/param-value&gt;
  &lt;/context-param&gt;
  
  &lt;!-- Recommendation from GAE pages --&gt;
  &lt;context-param&gt;
      &lt;param-name&gt;javax.faces.PROJECT_STAGE&lt;/param-name&gt;
      &lt;param-value&gt;Production&lt;/param-value&gt;
  &lt;/context-param&gt;
  
  &lt;context-param&gt;
      &lt;param-name&gt;javax.faces.DEFAULT_SUFFIX&lt;/param-name&gt;
      &lt;param-value&gt;.xhtml&lt;/param-value&gt;
  &lt;/context-param&gt;
  
  &lt;!-- ***** Accommodate Single-Threaded Requirement of Google AppEngine --&gt;
  &lt;context-param&gt;
      &lt;param-name&gt;com.sun.faces.enableThreading&lt;/param-name&gt;
      &lt;param-value&gt;false&lt;/param-value&gt;
  &lt;/context-param&gt;
  
  &lt;!-- ***** Load the JavaServer Faces Servlet ***** --&gt;
  &lt;servlet&gt;
      &lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;
      &lt;servlet-class&gt;javax.faces.webapp.FacesServlet&lt;/servlet-class&gt;
      &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
  &lt;/servlet&gt;
  &lt;servlet-mapping&gt;
      &lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;
      &lt;url-pattern&gt;/faces/*&lt;/url-pattern&gt;
  &lt;/servlet-mapping&gt;
  
  &lt;!-- ***** Specify session timeout of thirty (30) minutes. ***** --&gt;
  &lt;session-config&gt;
      &lt;session-timeout&gt;30&lt;/session-timeout&gt;
  &lt;/session-config&gt;
  &lt;welcome-file-list&gt;
      &lt;welcome-file&gt;index.xhtml&lt;/welcome-file&gt;
  &lt;/welcome-file-list&gt;
  &lt;/web-app&gt;
  </code></pre>
  
  <p><strong>Stacktrace after the change</strong></p>
  
  <pre><code>W 2011-06-25 03:13:11.763
  EXCEPTION 
  java.lang.ClassNotFoundException: javax.faces.webapp.FacesServlet
  at com.google.appengine.runtime.Request.process-32c47fe3ad43decc(Request.java)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
  at org.mortbay.util.Loader.loadClass(Loader.java:91)
  at org.mortbay.util.Loader.loadClass(Loader.java:71)
  at org.mortbay.jetty.servlet.Holder.doStart(Holder.java:73)
  at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:242)
  at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
  at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:685)
  at org.mortbay.jetty.servlet.Context.startContext(Context.java:140)
  at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
  at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
  at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)
  at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
  at com.google.net.rpc.impl.RpcUtil.runRpcInApplication(RpcUtil.java:422)
  at com.google.net.rpc.impl.Server$RpcTask.runInContext(Server.java:573)
  at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:448)
  at com.google.tracing.TraceContext.runInContext(TraceContext.java:688)
  at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:326)
  at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:318)
  at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:446)
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
  at java.lang.Thread.run(Thread.java:636)
  
  E 2011-06-25 03:13:11.766
  javax.servlet.ServletContext log: unavailable
  javax.servlet.UnavailableException: javax.faces.webapp.FacesServlet
  at org.mortbay.jetty.servlet.Holder.doStart(Holder.java:79)
  at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:242)
  at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
  at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:685)
  at org.mortbay.jetty.servlet.Context.startContext(Context.java:140)
  at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
  at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
  at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)
  at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
  at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.createHandler(AppVersionHandlerMap.java:202)
  at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.getHandler(AppVersionHandlerMap.java:171)
  at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:123)
  at com.google.apphosting.runtime.JavaRuntime.handleRequest(JavaRuntime.java:260)
  at com.google.apphosting.base.RuntimePb$EvaluationRuntime$2.handleRequest(RuntimePb.java:9673)
  at com.google.net.rpc.impl.RpcUtil.runRpcInApplication(RpcUtil.java:422)
  at com.google.net.rpc.impl.Server$RpcTask.runInContext(Server.java:573)
  at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:448)
  at com.google.tracing.TraceContext.runInContext(TraceContext.java:688)
  at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:326)
  at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:318)
  at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:446)
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
  at java.lang.Thread.run(Thread.java:636)
  
  W 2011-06-25 03:13:11.768
  Failed startup of context com.google.apphosting.utils.jetty.RuntimeAppEngineWebAppContext@11d2066{/,/base/data/home/apps/s~cse-info/1.351380543505614038}
  java.lang.NullPointerException
  at java.lang.Class.isAssignableFrom(Native Method)
  at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:256)
  at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
  at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:685)
  at org.mortbay.jetty.servlet.Context.startContext(Context.java:140)
  at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
  at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
  at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)
  at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
  at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.createHandler(AppVersionHandlerMap.java:202)
  at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.getHandler(AppVersionHandlerMap.java:171)
  at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:123)
  at com.google.apphosting.runtime.JavaRuntime.handleRequest(JavaRuntime.java:260)
  at com.google.apphosting.base.RuntimePb$EvaluationRuntime$2.handleRequest(RuntimePb.java:9673)
  at com.google.net.rpc.impl.RpcUtil.runRpcInApplication(RpcUtil.java:422)
  at com.google.net.rpc.impl.Server$RpcTask.runInContext(Server.java:573)
  at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:448)
  at com.google.tracing.TraceContext.runInContext(TraceContext.java:688)
  at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:326)
  at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:318)
  at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:446)
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
  at java.lang.Thread.run(Thread.java:636)
  
  C 2011-06-25 03:13:11.775
  Uncaught exception from servlet
  javax.servlet.UnavailableException: Initialization failed.
  at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.createHandler(AppVersionHandlerMap.java:211)
  at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.getHandler(AppVersionHandlerMap.java:171)
  at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:123)
  at com.google.apphosting.runtime.JavaRuntime.handleRequest(JavaRuntime.java:260)
  at com.google.apphosting.base.RuntimePb$EvaluationRuntime$2.handleRequest(RuntimePb.java:9673)
  at com.google.net.rpc.impl.RpcUtil.runRpcInApplication(RpcUtil.java:422)
  at com.google.net.rpc.impl.Server$RpcTask.runInContext(Server.java:573)
  at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:448)
  at com.google.tracing.TraceContext.runInContext(TraceContext.java:688)
  at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:326)
  at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:318)
  at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:446)
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
  at java.lang.Thread.run(Thread.java:636)
  </code></pre>