65.9K
CodeProject 正在变化。 阅读更多。
Home

Google App Engine - Java 教程

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.91/5 (3投票s)

2014年11月26日

CC (Attr 3U)

14分钟阅读

viewsIcon

16706

在本教程结束时,您将实现一个可工作的应用程序,一个简单的留言簿,允许用户将消息发布到公共留言板。

引言

欢迎使用 Google App Engine!创建 App Engine 应用程序很容易,只需几分钟。而且它免费开始:立即上传您的应用程序并与用户分享,无需付费,无需承诺。

Google App Engine 应用程序可以用 Java、Python、Go 或 PHP 编程语言编写。本教程将介绍 Java。如果您更喜欢使用 Python、Go 或 PHP 来构建您的应用程序,请参阅 PythonGoPHP 指南。

您将学到什么

在本教程中,您将学习如何执行以下操作

  • 使用 Apache Maven 轻松创建具有所需布局和文件的 App Engine 项目。
  • 构建项目以添加一个简单的应用程序,让用户可以发布问候语。
  • 将应用程序与 Google 帐户集成以进行用户身份验证。
  • 将用户数据保存到 Datastore,包含用户的电子邮件,并将问候语存储在数据库中。
  • 在本地开发服务器上构建和测试您的工作。
  • 将应用程序部署到生产环境的 App Engine。

在本教程结束时,您将实现一个可工作的应用程序,一个简单的留言簿,允许用户将消息发布到公共留言板。

教程设置

要完成本教程,您需要正确版本的 Java 和 Maven。

所需的 Java 版本

我们建议使用 Java 7,最好是企业版。

注意:如果您使用 Java 7 标志如下:-source 1.7 -target 1.7,您可能可以使用 Java 8。

下载 Java

如果您没有 Java,请按照这些说明下载 Java 7 的 Java Development Kit (JDK)

  1. 下载并安装它。

  2. 设置您的 JAVA_HOME 环境变量。如果您是 bash 用户

    1. 对于典型的 Linux 安装,请在您的 .bashrc 文件中添加类似以下内容的一行

      export JAVA_HOME=/usr/local/tools/java/jdk1.7.0_45.jdk
      
    2. 如果您使用 Mac OSX 和默认的终端应用程序,您的 shell 会话默认不会加载 .bashrc。因此,您可能需要在 .bash_profile 文件中添加类似以下内容的一行

      [ -r ~/.bashrc ] && source ~/.bashrc
      
    3. 如果您使用 Mac OSX 但不使用默认终端应用程序,例如,您使用 tmux 等终端管理应用程序,您可能需要在 .bashrc 文件中添加类似以下内容的一行

      export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/Home
      

所需的 Maven 版本

本教程需要 Apache Maven 3.1 或更高版本,因此如果您的计算机上没有安装,您需要下载它。要确定 Maven 是否已安装以及您拥有哪个版本,请调用以下命令

 mvn -v

此命令应显示一长串信息,开头类似 Apache Maven 3.1.0

如果您的计算机上未安装 Maven,您可以从 Apache Maven 网站下载 Maven,并按照 Apache Maven 的说明进行安装。

Google App Engine SDK 和 Maven

当您使用 Maven 时,您无需下载 Google App Engine SDK。Maven 会为您完成。您还将使用 Maven 在本地测试您的应用程序并将其上传(部署)到生产环境的 App Engine。

注意:完成教程后,您可以通过访问 App Engine Maven 插件目标 来了解有关 App Engine Maven 插件功能的更多信息。

创建项目

重要:本教程中的说明假定您正在使用本地计算机上的终端,并在同一台计算机上运行浏览器来针对本地开发服务器进行测试。

要创建新项目,您需要使用 App Engine 提供的 Maven App Engine 构件,称为 appengine-skeleton-archetype,如创建项目中所述。App Engine Maven 构件会创建部署和在 App Engine 上运行所需的项目布局和文件。

创建项目后,您需要配置新项目,如配置项目中所述。

有关使用 Maven 和 App Engine 的更多信息,请参阅使用 Apache Maven 指南。作为 Maven 的替代方案,您也可以使用 Eclipse 通过Google Eclipse 插件,或者使用Apache Ant

创建项目

创建项目

  1. 要将应用程序部署到生产环境的 App Engine,您需要一个应用程序 ID(项目 ID)。按如下方式创建一个新项目

    1. 在您的网络浏览器中访问 Google Developers Console,然后点击创建项目
    2. 提供项目名称Guestbook,并接受为您自动生成的项目 ID。
    3. 点击创建

    记下项目 ID,因为您将在下一步中将其作为应用程序 ID 提供。

    注意:或者,如果您想将 Google Developers Console 中现有项目的 ID 用于此项目,也可以使用该 ID。

  2. 切换到您想要构建项目的目录,然后调用 Maven 如下

    mvn archetype:generate -Dappengine-version=1.9.15 -Dapplication-id=your-app-id -Dfilter=com.google.appengine.archetypes:
    

    your-app-id 替换为您在上一步中获取的项目 ID 值。

  3. 通过提供 com.google.appengine.archetypes:appengine-skeleton-archetype 对应的数字,从构件列表中进行选择。

  4. 通过接受默认值,从显示的可用构件版本列表中选择最新版本。

  5. 当提示 Define value for property 'groupId' 时,提供您应用程序所需的命名空间;为了使本教程与 GitHub 上的源文件保持同步,请指定 com.example.guestbook

  6. 当提示 Define value for property 'artifactId' 时,提供您所需的项目名称;为了使本教程与 GitHub 上的源文件保持同步,请使用 guestbook

  7. 当提示 Define value for property 'version' 时,接受默认值。

  8. 当提示 Define value for property 'package' 时,提供您首选的包名(或接受默认值)。生成的 Java 文件将具有您在此处指定的包名。请注意,GitHub 上的源文件使用包名 com.example.guestbook,因此如果您想与示例源保持同步,则应使用该名称作为包名。

  9. 当提示确认您的选择时,接受默认值(Y)。

  10. 等待项目生成完成。然后更改目录到新项目目录。

  11. 此时您将没有任何源代码。但仍然构建项目以下载任何必需的库,方法是调用

        mvn clean install
    
  12. 等待项目构建完成。当项目成功完成后,您将看到类似以下的消息

        [INFO] --------------------------------------------------
        [INFO] BUILD SUCCESS
        [INFO] --------------------------------------------------
        [INFO] Total time: 1:16.656s
        [INFO] Finished at: Mon Sep 15 11:42:22 PDT 2014
        [INFO] Final Memory: 16M/228M
        [INFO] --------------------------------------------------
  13. 检查项目布局

    • 您将把自己的应用程序 Java 类添加到 src/main/java/...
    • 您将使用 src/main/webapp/WEB-INF/appengine.web.xml 文件配置您的应用程序
    • 您将使用 src/main/webapp/WEB-INF/web.xml 文件配置您的应用程序部署

    稍后我们将描述这些子目录中的内容。

您现在已准备好添加自己的应用程序代码和 UI。

添加应用程序代码和 UI

在本教程的这一部分,我们将创建一个集成 Google Accounts 的应用程序,以便用户可以使用他们的 Google 帐户登录。在 App Engine 中,与 Google Accounts 的集成通过 App Engine Users 服务实现。我们将使用此服务来个性化我们应用程序的问候。

在本教程的这一部分,应用程序的外观将如下所示(稍后我们会添加更多内容)

此应用程序由以下主要逻辑“部分”组成

  • 一个 JSP 页面,用户通过该页面与应用程序交互以发出请求。
  • 一个名为 GuestbookServlet.java 的 Servlet,它会提示用户登录,然后显示个性化的问候。

注意:本教程的这一部分是我们正在构建的应用程序的“中间”版本。它还没有数据存储逻辑和 UI。因此,如果您查看我们提供的 GitHub 查看项目链接,请确保转到项目内的phase1,而不是final

使用 JSP 创建 UI

创建 UI

  1. guestbook/src/main/webapp 中,创建一个名为 guestbook.jsp 的文件,内容如下

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ page import="com.google.appengine.api.users.User" %>
    <%@ page import="com.google.appengine.api.users.UserService" %>
    <%@ page import="com.google.appengine.api.users.UserServiceFactory" %>
    <%@ page import="java.util.List" %>
    <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
    
    <html>
    <head>
        <link type="text/css" rel="stylesheet" href="https://cloud.google.com/stylesheets/main.css"/>
    </head>
    
    <body>
    
    <%
        String guestbookName = request.getParameter("guestbookName");
        if (guestbookName == null) {
            guestbookName = "default";
        }
        pageContext.setAttribute("guestbookName", guestbookName);
        UserService userService = UserServiceFactory.getUserService();
        User user = userService.getCurrentUser();
        if (user != null) {
            pageContext.setAttribute("user", user);
    %>
    
    <p>Hello, ${fn:escapeXml(user.nickname)}! (You can
        <a href="<%= userService.createLogoutURL(request.getRequestURI()) %>">sign out</a>.)</p>
    <%
    } else {
    %>
    <p>Hello!
        <a href="<%= userService.createLoginURL(request.getRequestURI()) %>">Sign in</a>
        to include your name with greetings you post.</p>
    <%
        }
    %>
    
    
    <form action="/guestbook.jsp" method="get">
        <div><input type="text" name="guestbookName" value="${fn:escapeXml(guestbookName)}"/></div>
        <div><input type="submit" value="Switch Guestbook"/></div>
    </form>
    
    </body>
    </html>

    注意 App Engine Users 服务的导入。此外,默认情况下,webapp/WEB-INF/ 以外子目录中任何具有 .jsp 文件后缀的文件都会自动映射到由 .jsp 文件路径(包括文件名)组成的 URL 路径。此 JSP 将自动映射到 URL /guestbook.jsp

  2. guestbook/src/main/webapp 中,创建一个名为 stylesheets 的目录,然后创建一个名为 main.css 的文件,内容如下

    body {
        font-family: Verdana, Helvetica, sans-serif;
        background-color: #FFFFCC;
    }
  3. 继续进行 web.xml 配置,如下所述。

配置 web.xml

配置 web.xml 文件

  1. guestbook/src/main/webapp/WEB-INF 中,在文本编辑器中打开 web.xml,并将文件内容替换为以下内容

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE web-app PUBLIC
     "-//Oracle Corporation//DTD Web Application 2.3//EN"
     "http://java.sun.com/dtd/web-app_2_3.dtd">
    
    <web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5">
        <servlet>
            <servlet-name>guestbook</servlet-name>
            <servlet-class>com.example.guestbook.GuestbookServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>guestbook</servlet-name>
            <url-pattern>/guestbook</url-pattern>
        </servlet-mapping>
        <welcome-file-list>
            <welcome-file>guestbook.jsp</welcome-file>
        </welcome-file-list>
    </web-app>

    此配置将 Servlet 映射到其服务位置,并指定您创建的 JSP 文件作为应用程序主页。有关 web.xml 文件及其使用方法的更多信息,请参阅部署描述符页面。

  2. 继续进行 Servlet 创建,如下所述。

创建 Servlet GuestbookServlet.java

App Engine Java 应用程序使用 Java Servlet API 与 Web 服务器进行交互。HTTP Servlet 是一个可以处理和响应 Web 请求的应用程序类。此类扩展了 javax.servlet.GenericServlet 类或 javax.servlet.http.HttpServlet 类。

创建 Servlet

  1. guestbook/src/main/java 中,通过在 Linux 或 Mac OSX 终端窗口中调用以下命令来创建子目录 com/example/guestbook

    mkdir -p com/example/guestbook
    
  2. guestbook/src/main/java/com/example/guestbook 中,创建一个名为 GuestbookServlet.java 的文件。

  3. 将以下内容添加到文件中

    package com.example.guestbook;
    
    import com.google.appengine.api.users.User;
    import com.google.appengine.api.users.UserService;
    import com.google.appengine.api.users.UserServiceFactory;
    
    import java.io.IOException;
    import java.util.Properties;
    
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class GuestbookServlet extends HttpServlet {
      @Override
      public void doGet(HttpServletRequest req, HttpServletResponse resp)
          throws IOException {
        if (req.getParameter("testing") == null) {
          resp.setContentType("text/plain");
          resp.getWriter().println("Hello, this is a testing servlet. \n\n");
          Properties p = System.getProperties();
          p.list(resp.getWriter());
    
        } else {
          UserService userService = UserServiceFactory.getUserService();
          User currentUser = userService.getCurrentUser();
    
          if (currentUser != null) {
            resp.setContentType("text/plain");
            resp.getWriter().println("Hello, " + currentUser.getNickname());
          } else {
            resp.sendRedirect(userService.createLoginURL(req.getRequestURI()));
          }
        }
      }
    }

    该 Servlet 检查用户是否已登录。如果用户已登录,则 Servlet 会显示个性化的问候;否则,用户将被重定向到登录页面。

    注意:开发服务器知道如何模拟 Google Accounts 登录功能。因此,当此应用程序在您的本地计算机上运行时,重定向将转到一个页面,您可以在其中输入任何电子邮件地址来模拟帐户登录。但是,当应用程序在生产环境的 App Engine 上运行时,重定向将转到实际的 Google Accounts 屏幕。

  4. 您的项目应如下所示

    您的应用程序现在已准备好在本地开发服务器上进行构建和测试,如下所述。

构建和测试应用程序

构建和测试应用程序

  1. 更改目录到 guestbook,并调用命令

    mvn clean install
    

    等待构建完成。

  2. 通过从 /guestbook 调用此命令,在本地计算机上的开发服务器中运行应用程序

    mvn appengine:devserver

    等待成功消息,该消息类似如下

    [INFO] INFO: The admin console is running at https://:8080/_ah/admin
    [INFO] Aug 18, 2014 5:35:04 PM com.google.appengine.tools.development.DevAppServerImpl doStart
    [INFO] INFO: Dev App Server is now running
  3. 在与您的终端窗口运行在同一台机器上的浏览器中,访问 localhost:8080 以在您的本地计算机上访问该应用程序。如果出现提示,请点击登录

    注意:如果您在首次访问 localhost:8080 时遇到运行时错误,涉及到受限类,例如 java.lang.NoClassDefFoundError: java.nio.charset.StandardCharsets is a restricted class.,请检查 guestbook/pom.xml 的设置。App Engine 版本必须设置为最新的 App Engine SDK 版本:1.9.15。如果您收到 403 错误,请检查 web.xml 文件,确保该文件已按照上面“配置 web.xml”中的说明正确配置。

  4. 在登录表单中提供电子邮件,或接受 test@example.com 虚拟电子邮件并点击登录。(在本地运行时,没有有效性检查。)

  5. 观察问候语现在显示您的电子邮件地址。

  6. 您已成功创建了一个简单的 Java App Engine 应用程序。您已准备好进行更有用的操作,例如添加接受和存储用户帖子到数据库的功能。

将数据存储到 Datastore

在本教程的这一部分,我们将通过添加允许用户 POST 问候语并显示先前发布的问候语的 UI 来扩展前面创建的简单应用程序。为了支持 UI,我们将添加一个新的 Servlet 来处理与数据库的 POST 交互以存储数据。

我们正在使用的数据库是 App Engine Datastore,它是一个 NoSQL、无模式数据库,无需进一步注册或激活即可供您的应用程序使用。由于 Datastore 是无模式的,因此在开始写入 Datastore 之前,您无需预先在数据库中定义对象。您只需通过 import 语句导入所需的 Datastore 类,然后写入数据。(有关此强大存储系统的完整描述,请访问 App Engine Datastore 页面。)

注意:本教程出于简单起见,使用了低级 Datastore API。如果您希望使用它们,App Engine Datastore 还包括 Java Data Objects (JDO)Java Persistence API (JPA) 接口的实现。您也可以选择使用 ObjectifySlim3

添加 UI 和 Datastore 支持后,应用程序的外观将如下所示

我们将对现有应用程序进行以下更改

  • 编辑 JSP 页面,允许用户将问候语 POST 到数据存储,并显示当前存储的所有问候语。
  • 创建一个名为 SignGuestbookServlet.java 的新 Servlet,该 Servlet 处理与 Datastore 的交互。
  • web.xml 中添加必要的条目,以便将请求路由到新的 Servlet。

注意:本教程的这一部分是我们正在构建的应用程序的完成版(或“最终”版),包括数据存储逻辑和 UI。因此,如果您查看我们提供的 GitHub 查看项目链接,请确保转到项目内的final,而不是phase1

向 JSP 添加数据 POST 和显示 UI

添加新的 UI 组件

  1. guestbook/src/main/webapp 中,打开 guestbook.jsp 进行编辑,将以下导入添加到导入部分

    <%@ page import="com.google.appengine.api.datastore.DatastoreService" %>
    <%@ page import="com.google.appengine.api.datastore.DatastoreServiceFactory" %>
    <%@ page import="com.google.appengine.api.datastore.Entity" %>
    <%@ page import="com.google.appengine.api.datastore.FetchOptions" %>
    <%@ page import="com.google.appengine.api.datastore.Key" %>
    <%@ page import="com.google.appengine.api.datastore.KeyFactory" %>
    <%@ page import="com.google.appengine.api.datastore.Query" %>
  2. <form action="/guestbook.jsp" method="get"> 行的上方添加以下代码

    <%
        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
        Key guestbookKey = KeyFactory.createKey("Guestbook", guestbookName);
        // Run an ancestor query to ensure we see the most up-to-date
        // view of the Greetings belonging to the selected Guestbook.
        Query query = new Query("Greeting", guestbookKey).addSort("date", Query.SortDirection.DESCENDING);
        List<Entity> greetings = datastore.prepare(query).asList(FetchOptions.Builder.withLimit(5));
        if (greetings.isEmpty()) {
    %>
    <p>Guestbook '${fn:escapeXml(guestbookName)}' has no messages.</p>
    <%
    } else {
    %>
    <p>Messages in Guestbook '${fn:escapeXml(guestbookName)}'.</p>
    <%
        for (Entity greeting : greetings) {
            pageContext.setAttribute("greeting_content",
                    greeting.getProperty("content"));
            if (greeting.getProperty("user") == null) {
    %>
    <p>An anonymous person wrote:</p>
    <%
    } else {
        pageContext.setAttribute("greeting_user",
                greeting.getProperty("user"));
    %>
    <p><b>${fn:escapeXml(greeting_user.nickname)}</b> wrote:</p>
    <%
        }
    %>
    <blockquote>${fn:escapeXml(greeting_content)}</blockquote>
    <%
            }
        }
    %>
    
    <form action="/sign" method="post">
        <div><textarea name="content" rows="3" cols="60"></textarea></div>
        <div><input type="submit" value="Post Greeting"/></div>
        <input type="hidden" name="guestbookName" value="${fn:escapeXml(guestbookName)}"/>
    </form>

    查询相关的代码会在页面加载时执行查询;Datastore 会搜索当前为该应用程序存储在 Datastore 中的所有问候语,并在 UI 中列出它们。

    此代码的表单相关部分将一个包含用户新问候语的 POST 请求发送出去。该 POST 请求由 post 处理程序 Servlet SignGuestbookServlet.java 处理,您将在下一个过程中创建该 Servlet。

创建 Servlet SignGuestbookServlet.java

创建 Servlet

  1. guestbook/src/main/java/com/example/guestbook 中,创建一个名为 SignGuestbookServlet.java 的文件。

  2. 将以下内容添加到文件中

    package com.example.guestbook;
    
    import com.google.appengine.api.datastore.DatastoreService;
    import com.google.appengine.api.datastore.DatastoreServiceFactory;
    import com.google.appengine.api.datastore.Entity;
    import com.google.appengine.api.datastore.Key;
    import com.google.appengine.api.datastore.KeyFactory;
    import com.google.appengine.api.users.User;
    import com.google.appengine.api.users.UserService;
    import com.google.appengine.api.users.UserServiceFactory;
    
    import java.io.IOException;
    import java.util.Date;
    
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class SignGuestbookServlet extends HttpServlet {
      @Override
      public void doPost(HttpServletRequest req, HttpServletResponse resp)
          throws IOException {
        UserService userService = UserServiceFactory.getUserService();
        User user = userService.getCurrentUser();
    
        String guestbookName = req.getParameter("guestbookName");
        Key guestbookKey = KeyFactory.createKey("Guestbook", guestbookName);
        String content = req.getParameter("content");
        Date date = new Date();
        Entity greeting = new Entity("Greeting", guestbookKey);
        greeting.setProperty("user", user);
        greeting.setProperty("date", date);
        greeting.setProperty("content", content);
    
        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
        datastore.put(greeting);
    
        resp.sendRedirect("/guestbook.jsp?guestbookName=" + guestbookName);
      }
    }

    该 Servlet 是用户发布的问候语的 POST 处理程序。它从传入请求中获取问候语(content),并将其作为名为 Greeting 的实体存储在 Datastore 中,同时存储 Greeting 的属性,例如发布问候语的用户和发布日期。(有关 App Engine 中实体的更多信息,请参阅实体、属性和键)。

  3. 打开 guestbook/src/main/webapp/WEB-INF/web.xml 并确保新的 Servlet 已映射 URL。最终版本应如下所示

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
        <servlet>
            <servlet-name>sign</servlet-name>
            <servlet-class>com.example.guestbook.SignGuestbookServlet</servlet-class>
        </servlet>
        <servlet>
            <servlet-name>guestbook</servlet-name>
            <servlet-class>com.example.guestbook.GuestbookServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>sign</servlet-name>
            <url-pattern>/sign</url-pattern>
        </servlet-mapping>
        <servlet-mapping>
            <servlet-name>guestbook</servlet-name>
            <url-pattern>/guestbook</url-pattern>
        </servlet-mapping>
        <welcome-file-list>
            <welcome-file>guestbook.jsp</welcome-file>
        </welcome-file-list>
    </web-app>
  4. 您已准备好在本地开发服务器上进行构建和测试,如下所述。

构建和测试应用程序

构建和测试应用程序

  1. 更改目录到 guestbook,并调用命令

    mvn clean install
    

    等待构建完成。

  2. 通过调用此命令在开发服务器中运行应用程序

    mvn appengine:devserver
    

    等待成功消息,该消息类似如下

    INFO] INFO: The admin console is running at https://:8080/_ah/admin
    [INFO] Aug 18, 2014 5:35:04 PM com.google.appengine.tools.development.DevAppServerImpl doStart
    [INFO] INFO: Dev App Server is now running
    
  3. 在与您的终端窗口运行在同一台机器上的浏览器中,访问 localhost:8080 以访问该应用程序。如果您尚未登录,请点击登录,提供电子邮件地址,然后点击登录

  4. 在文本框中提供一条文本消息,然后点击发布问候。观察到问候语现在已显示在您的电子邮件名称下的问候语列表中。

创建索引

当您运行开发服务器并测试您的应用程序时,在 guestbook/target/guestbook-1.0-SNAPSHOT/WEB-INF/appengine-generated/datastore-indexes-auto.xml 中会自动生成生产环境 App Engine 运行所需的索引。您还会注意到同一位置的文件 local_db.bin:这是开发服务器用于在开发服务器会话之间持久化您的应用程序数据的本地存储。datastore-indexes-auto.xml 文件会与您的应用程序一起自动上传;local_db.bin 不会上传。

重要:请注意,运行 mvn clean install 会清除 datastore-indexes-auto.xml 文件;如果在上传到生产环境的 App Engine 之前在您的应用程序上运行它,您将不会获得所需的索引,并且会遇到运行时错误。

有关索引的完整信息,请参阅Datastore 索引

上传您的应用程序

在测试并运行开发服务器上的应用程序(该服务器也会生成所需的索引)后,您需要将应用程序上传到生产环境的 App Engine。

重要:您必须在上传应用程序之前生成所有必需的索引。

上传应用程序

  1. 在编辑器中打开文件 guestbook/target/guestbook-1.0-SNAPSHOT/WEB-INF/appengine-generated/datastore-indexes-auto.xml,并确保其包含以下内容

    <datastore-indexes>
        <datastore-index kind="Greeting" ancestor="true" source="manual">
            <property name="date" direction="desc"/>
        </datastore-index>
    </datastore-indexes>

    通常,您需要将 source="auto" 更改为 source="manual"

    注意:如果需要但未上传索引,您的应用程序可能在运行时失败。但是,在这种情况下,您可以通过检查错误消息来解决此问题:所需的索引包含在错误消息中。将这些索引条目从错误消息复制到 datastore-indexes-auto.xml,然后再次运行更新命令。

  2. 更改目录到 guestbook,然后调用 Maven 如下

    mvn appengine:update
  3. 首次上传时,系统将提示您提供登录信息,并通过浏览器引导您完成登录过程。按照提示操作。您可能需要在登录过程结束时将成功代码从浏览器复制到命令行。(执行一次后,此信息将被记住。)

  4. 等待上传完成。如果上传成功,您将看到类似以下的消息

    98% Uploading index definitions.
    
    Update for module default completed successfully.
    Success.
    Cleaning up temporary files for module default...
  5. 在您的浏览器中,访问 URL https://<project-ID>.appspot.com 来运行托管在 App Engine 上的应用程序,将 <project-ID> 替换为您的项目 ID。

 

除非另有说明,本页的代码示例根据 Apache 2.0 许可证 授权。

© . All rights reserved.