GAE - ClassNotFoundException的部署Appspot上服务器

GAE - ClassNotFoundException的部署Appspot上服务器

问题描述:

后我有留言的项目中使用Maven的原型com.google.appengine.archetypes:guestbook-archetype创建了谷歌的例子。当我使用mvn appengine:devserver在本地运行它时,它运行正常,当我尝试将它部署到Google Appspot时,问题就开始了。我得到以下信息:GAE - ClassNotFoundException的部署Appspot上服务器

Error: Server Error 

The server encountered an error and could not complete your request. 
If the problem persists, please report your problem and mention this error message and the query that caused it. 

在日志中我可以看到:

2013-05-01 05:38:28.356/500 3166ms 0kb Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.63 Safari/537.31 
2001:6d8:10:a014:5176:bdbe:c152:53c0 - - [01/May/2013:05:38:28 -0700] "GET/HTTP/1.1" 500 0 - "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.63 Safari/537.31" "aghinzop.appspot.com" ms=3167 cpu_ms=2100 loading_request=1 app_engine_release=1.7.7 instance=00c61b117cdf51947e909cbfaf52e1739a7f4c 
W 2013-05-01 05:38:28.325 
EXCEPTION 
java.lang.ClassNotFoundException: ioserv.ioserv.SignGuestbookServlet 
    at com.google.appengine.runtime.Request.process-53e8711216f37199(Request.java) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:359) 
    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.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:480) 
    at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:487) 
    at com.google.tracing.TraceContext.runInContext(TraceContext.java:774) 
    at com.google.tracing.TraceContext$DoInTraceContext.runInContext(TraceContext.java:751) 
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:342) 
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:334) 
    at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:484) 
    at java.lang.Thread.run(Thread.java:722) 
E 2013-05-01 05:38:28.326 
javax.servlet.ServletContext log: unavailable 
javax.servlet.UnavailableException: ioserv.ioserv.SignGuestbookServlet 
    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:219) 
    at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.getHandler(AppVersionHandlerMap.java:194) 
    at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:134) 
    at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:438) 
    at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:480) 
    at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:487) 
    at com.google.tracing.TraceContext.runInContext(TraceContext.java:774) 
    at com.google.tracing.TraceContext$DoInTraceContext.runInContext(TraceContext.java:751) 
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:342) 
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:334) 
    at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:484) 
    at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251) 
    at java.lang.Thread.run(Thread.java:722) 
W 2013-05-01 05:38:28.338 
Failed startup of context [email protected]11c3e97{/,/base/data/home/apps/s~aghinzop/1.367061823227494749} 
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:219) 
    at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.getHandler(AppVersionHandlerMap.java:194) 
    at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:134) 
    at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:438) 
    at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:480) 
    at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:487) 
    at com.google.tracing.TraceContext.runInContext(TraceContext.java:774) 
    at com.google.tracing.TraceContext$DoInTraceContext.runInContext(TraceContext.java:751) 
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:342) 
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:334) 
    at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:484) 
    at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251) 
    at java.lang.Thread.run(Thread.java:722) 
C 2013-05-01 05:38:28.342 
Uncaught exception from servlet 
javax.servlet.UnavailableException: Initialization failed. 
    at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.createHandler(AppVersionHandlerMap.java:228) 
    at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.getHandler(AppVersionHandlerMap.java:194) 
    at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:134) 
    at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:438) 
    at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:480) 
    at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:487) 
    at com.google.tracing.TraceContext.runInContext(TraceContext.java:774) 
    at com.google.tracing.TraceContext$DoInTraceContext.runInContext(TraceContext.java:751) 
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:342) 
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:334) 
    at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:484) 
    at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251) 
    at java.lang.Thread.run(Thread.java:722) 
I 2013-05-01 05:38:28.355 
This request caused a new process to be started for your application, and thus caused your application code to be loaded for the first time. This request may thus take longer and use more CPU than a typical request for your application. 

以下是一些基本的设置我在Eclipse和部署日志(我使用App Engine的Eclipse插件)。

enter image description here

我不知道什么是“禁用,因为这是一个Maven项目”是指这里。你能解释一下吗?我应该检查这个盒子吗?

enter image description here

App Engine的SDK这里选的是由Eclipse插件提供的一个。

enter image description here

下面是通过插件提供的库。还有一些Maven库由原型添加。

enter image description here

这里是在WEB-INF/lib中的库。我可以看到,他们中很少有人知道可能会丢失一些东西。问题是当我试图将libs复制到这个文件夹时,我得到了Cannot paste the clipboard contents into the selected elements。我怎样才能做到这一点?在一个正常的动态Web项目(使用这个方面),它就像Properties>Deployment Assembly>Add一样简单,但在这里我不知道如何做到这一点。

我真的很感谢您的帮助!谢谢!

我不知道什么是“禁用,因为这是一个Maven项目”是指这里。你能解释一下吗?我应该检查这个盒子吗?

有两种方式来管理你的应用程序(特别是web文件夹),一个让maven做它,其他让谷歌eclipse插件做。由于您的应用程序是由maven构建的,因此默认假设是您的web应用程序管理由maven自己完成,因此默认情况下,Google eclipse插件已将其禁用。 除非你不删除maven,它应该保持原样。

即将出错,我的猜测是,虽然你正在构建,并通过测试的行家,你可能会尝试通过Eclipse来部署,请尝试MVN AppEngine上:更新,它应该工作。

希望它有帮助。

+0

谢谢你的回复!经过近全天与斗争我想多了一个解决方案,具体说明如下:http://javanto.com/blog/2012/01/11/gae-eclipse-maven-2-0/有了这个,我去了很远,但当我了解到它仅提供对Hibernate的非常有限的支持并且不支持JPA2时,完全放弃了App Engine。现在我正在cloudbees.com上开发,它支持Tomcat/Spring/Hibernate/Maven的整个堆栈,并且在大约一个小时内就启动并运行了。我们会看看他们之后是否不会收费,但到目前为止它表示它应该是免费的。 – Wojtek 2013-05-01 21:50:57

+0

很好,你终于能够取得进步,并希望你能够用cloudbees做得很好。 只是要添加,App Engine不支持[JPA 2](https://developers.google.com/appengine/docs/java/datastore/jpa/) – skywalker 2013-05-02 17:03:17

+0

感谢您指出,我必须误解一些东西。昨天有点累了。但是我仍然认为App Engine现在太有限了,或者换句话说 - 限制太多了。 – Wojtek 2013-05-02 17:35:03