2012-01-22 12 views
26

¿Hay alguna forma de cargar un HttpServlet personalizado en GAE? He subido un proyecto que incluía una HttpServlet en el paquete .server y lo añadió a la Web.xml ...java.lang.VerifyError: esperar un marco de mapa de pila

<servlet> 
    <servlet-name>testServlet</servlet-name> 
    <servlet-class>gwtone.server.TestServlet</servlet-class> 
</servlet> 

<servlet-mapping> 
    <servlet-name>testServlet</servlet-name> 
    <url-pattern>/tester/greet</url-pattern> 
</servlet-mapping> 

¿Hay alguna otra cosa que me falta, o no es posible?

-------- -------- EDITAR

algunas cosas que aparecen cuando init mi servidor, que no estoy acostumbrado a ver ...

Jan 22, 2012 4:23:44 AM com.google.apphosting.utils.jetty.JettyLogger info 
INFO: Logging to JettyLogger(null) via com.google.apphosting.utils.jetty.JettyLogger 
Jan 22, 2012 4:23:44 AM com.google.apphosting.utils.config.AppEngineWebXmlReader readAppEngineWebXml 
INFO: Successfully processed E:\Program Files\eclipse-SDK-3.7.1-win32-x86_64\Workspace\gwtone\war\WEB-INF/appengine-web.xml 
Jan 22, 2012 4:23:44 AM com.google.apphosting.utils.config.AbstractConfigXmlReader readConfigXml 
INFO: Successfully processed E:\Program Files\eclipse-SDK-3.7.1-win32-x86_64\Workspace\gwtone\war\WEB-INF/web.xml 
Jan 21, 2012 10:23:44 PM com.google.appengine.tools.development.DevAppServerImpl start 
INFO: The server is running at http://localhost:8888/ 
Jan 21, 2012 10:23:44 PM com.google.appengine.tools.development.DevAppServerImpl start 
INFO: The admin console is running at http://localhost:8888/_ah/admin 

y esto es lo que se muestra cuando se rompe ..

WARNING: Error for /tester/greet 
java.lang.VerifyError: Expecting a stackmap frame at branch target 14 in method gwtone.server.TestServlet.doGet(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V at offset 0 
    at java.lang.Class.getDeclaredConstructors0(Native Method) 
    at java.lang.Class.privateGetDeclaredConstructors(Unknown Source) 
    at java.lang.Class.getConstructor0(Unknown Source) 
    at java.lang.Class.newInstance0(Unknown Source) 
    at java.lang.Class.newInstance(Unknown Source) 
    at org.mortbay.jetty.servlet.Holder.newInstance(Holder.java:153) 
    at org.mortbay.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:428) 
    at org.mortbay.jetty.servlet.ServletHolder.getServlet(ServletHolder.java:339) 
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) 
    at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:35) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:60) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.appengine.tools.development.BackendServersFilter.doFilter(BackendServersFilter.java:97) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) 
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 
    at com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:78) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:362) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at org.mortbay.jetty.Server.handle(Server.java:326) 
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923) 
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:547) 
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212) 
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) 
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) 

editar # 2

package gwtone.server; 
import java.io.IOException; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

public class TestServlet extends HttpServlet { 

public TestServlet(){} 

@Override 
public void doGet(HttpServletRequest req, HttpServletResponse resp) 
     throws ServletException, IOException { 
    System.out.println("0"); 
    try { 
     System.out.println("1"); 
     resp.getWriter().println("IT WORKED"); 
     resp.getWriter().flush(); 
     System.out.println("2"); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    System.out.println("3"); 
} 
} 
+0

La configuración siempre se ve bien. ¿Puede proporcionar un registro o mensaje de error? – h3xStream

+0

ver mi edición anterior – user1163009

+0

VerifyError probablemente se refieren a bytecode inválido. Verifique que la clase Servlet esté libre de error de compilación (más específicamente, el método doGet o el constructor). Si es posible, publique el código del servlet. – h3xStream

Respuesta

25

GAE usa Java 1.6, pero compiló el código con Java 1.7. Necesitas recompilar con Java 1.6. Según los comentarios, estás usando Eclipse; puede establecer el nivel del compilador de Java en Java> Compilador sección de las propiedades del proyecto.

enter image description here

+0

gracias, traté de usar 1.6 como mi predeterminado a través del panel de control de Windows, pero supongo que tuve que cambiarlo en eclipse ... – user1163009

+0

y mi jdk predeterminado para eclipse se cambia a 1.6, gracias de nuevo – user1163009

+1

1.6 está obsoleto por GAE ahora – ZiglioUK

35

Como BalusC señaló, una solución para el problema es que sólo tiene que utilizar JDK6.

Otra solución, si desea permanecer con JDK7, sería utilizar "-XX: -UseSplitVerifier" como argumento para la máquina virtual. JRE Ir a

Ventana → Preferencias → → Java instalado → Editar ... → predeterminados VM argumentos

y añadir allí.

Installed JREs JRE Definition

+0

gracias Dominik, esta solución funciona con JDK 7 –

+1

esta es una solución tonta: 1. Use Oracle Solaris (si encuentro el enlace a eso, lo publicaré) 2. Puede resolver el servidor de desarrollo, ¿qué pasa con el servidor de producción de GAE? – ZiglioUK

+0

más en la opción UserSplitVerifier: https://stackoverflow.com/questions/15253173/how-safe-is-it-to-use-xx-usesplitverifier –

1

Usando -XX: -UseSplitVerifier es una solución temporal. Ahora java usa la versión anterior del verificador de código de bytes que tolera estos marcos de mapas de pila malos o faltantes. Java8 no admite esta opción.

0

pude resolver este problema estableciendo propiedades Eclipse Marte/Proyecto/Java compilador:

  • nivel de cumplimiento del compilador a 1,7 (como no tengo más 1.6)
  • generada .class compatibilidad de archivos: compatibilidad 1,6
  • Fuente: 1,6

como no lo hice tienen 1,7 código específico :-)

servidor Ubuntu + Tomcat 7.0.52 en la máquina virtual Java 1.7.0_85-b01 Dev Eclipse Marte el JDK 7u55

Cuestiones relacionadas