使用 Eclipse 插件追加新谷歌的空指针异常

Posted

技术标签:

【中文标题】使用 Eclipse 插件追加新谷歌的空指针异常【英文标题】:null pointer exception for new google appending using eclipse plugin 【发布时间】:2012-08-31 10:39:30 【问题描述】:

我最近尝试使用 Google eclipse 插件创建一个新的 gwt/gae 项目。我过去成功地做到了这一点,并且我有几个正在开发的项目没有问题。

我在尝试启动 Web 应用程序时收到 NullPointerException。这是堆栈跟踪。

WARNING: EXCEPTION 
java.lang.ClassNotFoundException: com.google.api.server.spi.SystemServiceServlet
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at com.google.appengine.tools.development.IsolatedAppClassLoader.loadClass(IsolatedAppClassLoader.java:176)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    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 org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
    at org.mortbay.jetty.Server.doStart(Server.java:224)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at com.google.appengine.tools.development.JettyContainerService.startContainer(JettyContainerService.java:196)
    at com.google.appengine.tools.development.AbstractContainerService.startup(AbstractContainerService.java:239)
    at com.google.appengine.tools.development.DevAppServerImpl.start(DevAppServerImpl.java:146)
    at com.google.appengine.tools.development.gwt.AppEngineLauncher.start(AppEngineLauncher.java:97)
    at com.google.gwt.dev.DevMode.doStartUpServer(DevMode.java:509)
    at com.google.gwt.dev.DevModeBase.startUp(DevModeBase.java:1068)
    at com.google.gwt.dev.DevModeBase.run(DevModeBase.java:811)
    at com.google.gwt.dev.DevMode.main(DevMode.java:311)
Sep 6, 2012 2:42:25 PM com.google.appengine.tools.development.ApiProxyLocalImpl log
SEVERE: javax.servlet.ServletContext log: unavailable
javax.servlet.UnavailableException: com.google.api.server.spi.SystemServiceServlet
    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 org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
    at org.mortbay.jetty.Server.doStart(Server.java:224)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at com.google.appengine.tools.development.JettyContainerService.startContainer(JettyContainerService.java:196)
    at com.google.appengine.tools.development.AbstractContainerService.startup(AbstractContainerService.java:239)
    at com.google.appengine.tools.development.DevAppServerImpl.start(DevAppServerImpl.java:146)
    at com.google.appengine.tools.development.gwt.AppEngineLauncher.start(AppEngineLauncher.java:97)
    at com.google.gwt.dev.DevMode.doStartUpServer(DevMode.java:509)
    at com.google.gwt.dev.DevModeBase.startUp(DevModeBase.java:1068)
    at com.google.gwt.dev.DevModeBase.run(DevModeBase.java:811)
    at com.google.gwt.dev.DevMode.main(DevMode.java:311)

Sep 6, 2012 2:42:25 PM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: failed SystemServiceServlet: java.lang.NullPointerException
Sep 6, 2012 2:42:26 PM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: Failed startup of context com.google.appengine.tools.development.DevAppEngineWebAppContext@75e04ee8/,/Users/bucky/Documents/workspace/Birthday/war
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 org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
    at org.mortbay.jetty.Server.doStart(Server.java:224)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at com.google.appengine.tools.development.JettyContainerService.startContainer(JettyContainerService.java:196)
    at com.google.appengine.tools.development.AbstractContainerService.startup(AbstractContainerService.java:239)
    at com.google.appengine.tools.development.DevAppServerImpl.start(DevAppServerImpl.java:146)
    at com.google.appengine.tools.development.gwt.AppEngineLauncher.start(AppEngineLauncher.java:97)
    at com.google.gwt.dev.DevMode.doStartUpServer(DevMode.java:509)
    at com.google.gwt.dev.DevModeBase.startUp(DevModeBase.java:1068)
    at com.google.gwt.dev.DevModeBase.run(DevModeBase.java:811)
    at com.google.gwt.dev.DevMode.main(DevMode.java:311)

我不知道去哪里调试这个。

【问题讨论】:

我在使用 JDK 1.6 和 Eclipse indigo 时遇到了同样的问题 - 通过将应用程序代码部署到 Google 的 App Engine,我设法让应用程序代码运行一次。然后 Eclipse 将毫无问题地编译它。我试图再次复制这个,以便一步一步地提供,没有运气,错误又回来了。 ***.com/questions/12060233/… 【参考方案1】:

我使用 Google 插件 (GWT + GAE) 全新安装了 Eclipse Juno。我现在注意到该插件一直在尝试修改我的 web.xml 文件。

它尝试添加这个 servlet 定义:

  <servlet>
    <servlet-name>SystemServiceServlet</servlet-name>
    <servlet-class>com.google.api.server.spi.SystemServiceServlet</servlet-class>
    <init-param>
      <param-name>services</param-name>
      <param-value/>
    </init-param>
  </servlet>

  <servlet-mapping>
    <servlet-name>SystemServiceServlet</servlet-name>
    <url-pattern>/_ah/spi/*</url-pattern>
  </servlet-mapping>

我无法弄清楚如何阻止它发生,但这真的很烦人,因为我需要不断恢复该文件以避免签入这些更改。

尝试从您的 web.xml 文件中删除该 servlet。它似乎没有任何目的。它可能与谷歌云有关

【讨论】:

您在这里提出的答案是从 web.xml 中删除 servlet 吗?这读起来更像是一个问题而不是一个答案,把你的总结放在第一位可能会更清楚一点。 谢谢我刚刚在迁移到 SDK 1.7.3 时遇到了同样的问题,它确实通过添加 SystemServiceServlet 来修改 web.xml,这确实会破坏服务器。删除它有效。 每次您在项目中保存文件时,它都会继续修改您的 web.xml。要关闭此功能,请在 Eclipse 中打开您的项目设置,然后选择 Builders,然后取消选中“Google App Engine Project Change Notifier”框【参考方案2】:

当我在 Eclipse 中从 1.6.4 更新到 1.7.3 时发生这种情况,并且由于某种原因更新出错,两个版本的部分都留在了库中;我想这就是发生在其他所有人身上的事情。修复是关闭所有 AppEngine 项目并再次进行更新,然后将 1.7.3 切换为默认版本。如果仍然存在问题,请查看属性 -> 构建路径 -> 库,因为可能仍然有一个 1.6.4 本地支持库,您只需要删除它,然后就可以使用这个 servlet。

很高兴知道这个 servlet 做了什么,我在 Google 上根本找不到任何文档,但如果插件配置正确,肯定不会造成任何问题。

【讨论】:

【参考方案3】:

对于那些将来会遇到同样问题的人,我也会发布我的解决方案。

显然我的问题只是 GWT 库损坏了。

所以我做的是

继续项目 --> 属性 --> Google --> Web Toolkit --> 点击“使用特定 SDK” 指定与默认版本相同的版本(以便 Eclipse 重新创建 GWT 库和链接)。

之后一切正常。

干杯

【讨论】:

【参考方案4】:

虽然这可能不是一个合适的解决方案,但我设法让它在我的环境中工作:

将 eclipse 更新到最新版本的 indigo (3.7.2) 卸载/安装 Google App Engine 工具 从以下教程创建新项目(您可以检查“生成项目示例代码”),这将为您添加所有的 hello world

运行它应该很好。

ps:由于某种原因,我的 Eclipse 没有显示任何调试输出,但 dev_appserver.sh 不再抱怨错误。

【讨论】:

作为旁注,我想通了为什么 Eclipse 不能运行我的 .. 它一直抱怨缺少 com.appengine.tools.development.DevAppServerMain - 结果,您可以简单地将其复制到您的 war/WEB-INF/lib/ 来自 com.google.appengine.eclipse.sdkbundle_1.7.1/appengine-java-sdk-1.7.1/lib/appengine-tools-api.jar 的目录 - 之后一切顺利。

以上是关于使用 Eclipse 插件追加新谷歌的空指针异常的主要内容,如果未能解决你的问题,请参考以下文章

Grails 渲染插件的空指针异常

Android - this.cordova.getActivity().getApplicationContext() 的空指针异常

安卓谷歌地图:空指针异常

我以外的其他机器上的空指针异常[重复]

java中的空指针异常怎么解决

使用 PlainUsername 的空指针异常