如何在Google App Engine 1.6.5中运行JSF 2.0

时间:2012-05-06 22:21:33

标签: google-app-engine jsf web-deployment

好的,我刚刚完成了我的第一个JSF项目,我想把它上传到GAE。我在过去4个小时内一直在努力,但无法使其发挥作用。

我正在使用JSF 2.0和App Engine 1.6.5。

我尝试了几个教程和以下所有组合:

First tutorial

Jars - javax.faces-2.1.7-sources.jar el-ri-1.0.jar

设置 - GAE 1.6.5,JDK 1.7

错误:

java.lang.NoClassDefFoundError: javax.naming.InitialContext is a restricted class.     Please see the Google  App Engine developer's guide for more details.
at com.google.appengine.tools.development.agent.runtime.Runtime.reject(Runtime.java:51)

我认为这是因为我使用了不同的配置,所以我改为使用确切的设置。降级到GAE 1.6.3.1,并使用了教程中的确切jar,但没有什么不同。

所以我尝试了第二个教程,其中列出了修复列表,其中涉及用jsf-impl-gae.jar替换jsf-impl.jar,但这没有帮助。

执行此操作后,我收到错误消息:

WARNING: failed com.google.appengine.tools.development.DevAppEngineWebAppContext@1678d71{/,C:\Users\TOSHIBA\Documents\NetBeansProjects\Google AppEngine JSF 2.0 Template\war}: java.lang.VerifyError: Expecting a stackmap frame at branch target 36 in method com.sun.faces.config.WebConfiguration.getServletContextName()Ljava/lang/String; at offset 10
May 07, 2012 5:07:17 AM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: failed JettyContainerService$ApiProxyHandler@1547ec9: java.lang.VerifyError: Expecting a stackmap frame at branch target 36 in method com.sun.faces.config.WebConfiguration.getServletContextName()Ljava/lang/String; at offset 10
May 07, 2012 5:07:17 AM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: Error starting handlers
java.lang.VerifyError: Expecting a stackmap frame at branch target 36 in method com.sun.faces.config.WebConfiguration.getServletContextName()Ljava/lang/String; at offset 10
at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:163)

我也尝试了指南listed here

我已经在两个不同的应用引擎SDK和两个JDK上尝试了所有可能的教程组合,我现在拥有7个jar:el-api-2.2.1-b04.jar,el-impl-2.2.1-b05 .jar,el-ri-1.0.jar,javax.faces-2.1.7.jar,javax.faces-2.1.7-sources.jar,jsf-api-2.1.7.jar,jsf-impl-gae.jar

任何帮助将不胜感激我想我明天将寻找一种不同的方式上传我的项目,因为我只有JSF和Eclipse的麻烦,因此为什么我总是使用Netbeans但Netbeans的GAE插件不再运行

谢谢

1 个答案:

答案 0 :(得分:4)

来自the tutorial

  

3.3创建一个新的WebConfiguration.java。

     

JSF 2正在使用GAE不支持的“javax.naming.InitialContext”。

     

要解决此问题,您需要获取JSF源代码的副本,克隆WebConfiguration.java,使用“javax.naming.InitialContext”类的注释方法,将其放入“src / com / sun / faces /comfig/WebConfiguration.java“。现在,您新创建的WebConfiguration.java类将重载原始的WebConfiguration.java。

根据教程,抛出ClassDefNotFoundError的类是一个受限制的类。您需要访问GAE-JSF javax.naming.InitialContext is a Restricted Class Source Code并检索JSF源代码的副本并制作WebConfiguration类的副本并重载原始文件。

GAE的白名单可以通过重命名包来覆盖,或者在这种情况下完全避免它们。为了澄清,此步骤要求您执行的操作是将WebConfiguration.java替换为您修改的一个,其中使用InitialContext的所有方法都被注释掉。这会从Google的白名单中隐藏该类,因此它不会强制ClassNotFoundDefErrors。