3

好的,我刚刚完成了我的第一个 JSF 项目,我想将它上传到 GAE。我已经尝试了大约 4 个小时,但无法使其正常工作。

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

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

第一个教程

罐子 - 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)

我也试过这里列出的指南

我已经在两个不同的应用程序引擎 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 插件不再起作用。

谢谢

4

1 回答 1

4

教程

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 Class 的副本并重载原始代码。

GAE's Whitelisting can be overrided by renaming packages or, in this case, avoiding them altogether. To clarify, what this step is asking you to do is replace WebConfiguration.java with one you modify where all methods using InitialContext are commented out. This hides that class from Google's whitelist so it doesn't force ClassNotFoundDefErrors.

于 2012-05-06T23:11:09.733 回答