使用Objectify的裸骨GAE应用程序失败

时间:2018-04-03 18:45:45

标签: java google-app-engine objectify google-eclipse-plugin

我使用Eclipse IDE for Java Developers 4.7.3使用Objectify创建了一个简单的Google App Engine标准应用程序。当我部署应用程序并调用Web服务时,我得到java.lang.NoClassDefFoundError:无法初始化类com.googlecode.objectify.ObjectifyService。我究竟做错了什么?以下是重现此错误的步骤:

  1. 运行Eclipse
  2. 从Google Cloud Platform菜单中,选择Google App Engine标准版Java项目
  3. 在项目名称框中,键入项目名称(例如ObjectifyTest)
  4. 在Java版本框中,选择Java 8,Servlet 3.1
  5. 选中“创建为Maven项目框”
  6. 在组ID框中,输入组ID(例如com.pushpin.objectifytest)
  7. 在工件ID框中,输入工件ID(例如objectifytest)
  8. 查看Google Cloud Endpoints框
  9. 选中Objectify框
  10. 点击完成
  11. 打开web.xml文件并从https://github.com/objectify/objectify/wiki/Setup
  12. 添加ObjectifyFilter
  13. 从Google Cloud Platform菜单中,选择Deploy to App Engine Standard
  14. 单击项目(或创建新项目,然后刷新)
  15. 点击部署
  16. 调用servlet(例如,通过打开https://pushpin-objectify-test.appspot.com/hello
  17. 请注意500服务器错误
  18. 检查日志
  19. 请注意java.lang.NoClassDefFoundError:无法初始化类com.googlecode.objectify.ObjectifyService
  20. 这是我的web.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
        version="3.1">
        <filter>
            <filter-name>ObjectifyFilter</filter-name>
            <filter-class>com.googlecode.objectify.ObjectifyFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>ObjectifyFilter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
        <welcome-file-list>
            <welcome-file>index.html</welcome-file>
            <welcome-file>index.jsp</welcome-file>
        </welcome-file-list>
    </web-app>
    

    这是我的pom.xml:

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    
      <modelVersion>4.0.0</modelVersion>
      <packaging>war</packaging>
      <version>0.1.0-SNAPSHOT</version>
    
      <groupId>com.pushpin.objectifytest</groupId>
      <artifactId>objectifytest</artifactId>
    
      <properties>
        <appengine.maven.plugin.version>1.3.1</appengine.maven.plugin.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.showDeprecation>true</maven.compiler.showDeprecation>
      </properties>
    
      <prerequisites>
        <maven>3.3.9</maven>
      </prerequisites>
    
      <dependencies>
        <!-- Compile/runtime dependencies -->
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.1.0</version>
          <scope>provided</scope>
        </dependency>
        <dependency>
          <groupId>javax.servlet.jsp</groupId>
          <artifactId>javax.servlet.jsp-api</artifactId>
          <version>2.3.1</version>
          <scope>provided</scope>
        </dependency>
        <dependency>
          <groupId>com.google.appengine</groupId>
          <artifactId>appengine-api-1.0-sdk</artifactId>
          <version>1.9.57</version>
          <scope>provided</scope>
        </dependency>
    
        <dependency>
          <groupId>jstl</groupId>
          <artifactId>jstl</artifactId>
          <version>1.2</version>
        </dependency>
    
        <!-- Test Dependencies -->
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.12</version>
          <scope>test</scope>
        </dependency>
        <dependency>
          <groupId>com.google.endpoints</groupId>
          <artifactId>endpoints-framework</artifactId>
          <version>2.0.13</version>
        </dependency>
        <dependency>
          <groupId>com.googlecode.objectify</groupId>
          <artifactId>objectify</artifactId>
          <version>5.1.22</version>
        </dependency>
      </dependencies>
    
      <build>
        <!-- for hot reload of the web application-->
        <outputDirectory>${project.build.directory}/${project.build.finalName}/WEB-INF/classes</outputDirectory>
        <plugins>
          <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>versions-maven-plugin</artifactId>
            <version>2.3</version>
            <executions>
              <execution>
                <phase>compile</phase>
                <goals>
                  <goal>display-dependency-updates</goal>
                  <goal>display-plugin-updates</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
    
          <plugin>
            <groupId>com.google.cloud.tools</groupId>
            <artifactId>appengine-maven-plugin</artifactId>
            <version>${appengine.maven.plugin.version}</version>
          </plugin>
        </plugins>
      </build>
    </project>
    

    这是我的HelloAppEngine.java文件:

    package com.pushpin.objectifytest;
    
    import java.io.IOException;
    
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    @WebServlet(
        name = "HelloAppEngine",
        urlPatterns = {"/hello"}
    )
    public class HelloAppEngine extends HttpServlet {
    
      @Override
      public void doGet(HttpServletRequest request, HttpServletResponse response) 
          throws IOException {
    
        response.setContentType("text/plain");
        response.setCharacterEncoding("UTF-8");
    
        response.getWriter().print("Hello App Engine! 1a");
    
      }
    }
    

    这是堆栈跟踪:

    com.google.apphosting.runtime.jetty9.JettyLogger warn: Error for /hello (JettyLogger.java:29)
    java.lang.NoClassDefFoundError: Could not initialize class com.googlecode.objectify.ObjectifyService
        at com.googlecode.objectify.ObjectifyFilter.doFilter(ObjectifyFilter.java:47)
        at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1759)
        at com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:125)
        at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1759)
        at com.google.apphosting.runtime.jetty9.SaveSessionFilter.doFilter(SaveSessionFilter.java:37)
        at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1759)
        at com.google.apphosting.utils.servlet.JdbcMySqlConnectionCleanupFilter.doFilter(JdbcMySqlConnectionCleanupFilter.java:60)
        at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1759)
        at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:48)
        at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1759)
        at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:582)
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
        at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:524)
        at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226)
        at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1180)
        at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:512)
        at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
        at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1112)
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
        at com.google.apphosting.runtime.jetty9.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:297)
        at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134)
        at org.eclipse.jetty.server.Server.handle(Server.java:534)
        at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:320)
        at com.google.apphosting.runtime.jetty9.RpcConnection.handle(RpcConnection.java:202)
        at com.google.apphosting.runtime.jetty9.RpcConnector.serviceRequest(RpcConnector.java:81)
        at com.google.apphosting.runtime.jetty9.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:108)
        at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.dispatchServletRequest(JavaRuntime.java:680)
        at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.dispatchRequest(JavaRuntime.java:642)
        at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:612)
        at com.google.apphosting.runtime.JavaRuntime$NullSandboxRequestRunnable.run(JavaRuntime.java:806)
        at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:274)
        at java.lang.Thread.run(Thread.java:745)
    

1 个答案:

答案 0 :(得分:0)

这听起来像https://github.com/GoogleCloudPlatform/google-cloud-eclipse/issues/2972

导致已经回滚的服务器端更改;并按照上面的步骤1-15我无法重现它。

也就是说,尝试从pom.xml中删除<scope>provided<scope>标签以获取appengine-api-1.0-sdk依赖项。同时将appengine-api-1.0-sdk升级到1.9.63