部署 Java 应用

部署应用,以便将应用上传到 App Engine 并在 App Engine 上运行应用。部署应用时,您可以在 App Engine 中创建这些应用的版本及其对应的服务。您可以部署整个应用(包括所有源代码和配置文件),也可以部署和更新单个版本或配置文件

要以编程方式部署应用,请使用 Admin API

准备工作

在部署应用之前,请做好以下准备:

要使用 Maven 部署应用,您的项目必须设置为使用 App Engine Maven 插件

安装 appcfg 工具(备用)

要使用 appcfg 工具部署应用,您必须下载并安装适用于 Java 的 App Engine SDK:

下载 SDK

部署应用

要将应用部署到 App Engine,您可以运行 Maven(推荐)或从应用的根目录中运行 appcfg 命令。

要使用 Maven 部署应用,请从 pom.xml 文件所在的项目顶级目录中运行以下命令。

如果您使用的是基于 App Engine SDK 的 Maven 插件,请使用以下命令:

mvn appengine:update

如果您使用的是基于 Cloud SDK 的 Maven 插件,请使用以下命令:

mvn appengine:deploy

使用 appcfg(备用)

要部署应用,请使用 update 操作和 WAR 文件的目录路径运行 appcfg 命令,例如:

Windows

appengine-java-sdk\bin\appcfg.cmd [options] update [WAR_LOCATION]

Mac / Linux

./appengine-java-sdk/bin/appcfg.sh [options] update [WAR_LOCATION]

如果您使用的是 HTTP 代理,请添加 --proxy 参数以告知 appcfg 代理的地址。如果您针对 HTTPS 使用不同的代理,则还要添加 --proxy_https 参数。如需了解详情,请参阅 appcfg 命令行参数

Windows

appengine-java-sdk\bin\appcfg.cmd --proxy=10.1.2.3 update [WAR_LOCATION]

Mac / Linux

./appengine-java-sdk/bin/appcfg.sh --proxy=10.1.2.3 update [WAR_LOCATION]

默认情况下,您部署到服务的初始版本会自动配置为接收 100% 的流量。但是,必须手动配置您部署到同一服务的所有后续版本,否则这些版本将收不到任何流量。

该工具会自动使用 appengine-web.xml 文件中的应用 ID。但是,我们的许多示例应用都省略了 appengine-web.xml 文件中的 <application> 以及 <version>。因此,您必须确保为应用 ID 指定 GCP 项目 ID 以及要使用的版本 ID,例如:

Windows

appengine-java-sdk\bin\appcfg.cmd -A [YOUR_PROJECT_ID] -V [YOUR_VERSION_ID] update [WAR_LOCATION]

Mac / Linux

./appengine-java-sdk/bin/appcfg.sh -A [YOUR_PROJECT_ID] -V [YOUR_VERSION_ID] update [WAR_LOCATION]

部署多个服务应用

当您的应用被分解为多项服务时,您可以单独部署和更新目标服务,也可以同时部署和更新所有服务。部署服务更新可能包括更新单个配置文件或更新相应版本中的源代码。

例如,您可以在 App Engine 中部署和创建两个版本,其中每个版本都在各自的服务中运行。第一个版本用作前端服务,另一个版本用作应用的后端。然后,您可以部署单个配置文件以仅更新服务的设置。您还可以选择将新版本部署到服务,以便同时更新前端和/或后端的源代码。

多项服务的要求

您可以使用相同的部署命令来部署和更新应用的多项服务,但需要满足以下要求:

  • 必须先将应用的某个版本部署到 default 服务,然后才能创建和部署后续服务。

  • 您必须在相应版本的 appengine-web.xml 配置文件中指定服务的 ID。要指定服务 ID,您可以在每个配置文件中添加 module: [YOUR_SERVICE_ID] 元素定义。默认情况下,如果从配置文件中删除此元素定义会导致相应版本部署到 default 服务。

  • 必须在部署命令中指定所有相应的 appengine-web.xml 配置文件,才能同时部署多项服务。必须首先列出 default 服务。

部署多项服务

从配置文件所在应用的根目录中,运行部署命令并指定每项服务的 appengine-web.xml 文件的相对路径和文件名:

使用 Maven

如果项目的根目录仅包含您的服务,您可以使用单个 Maven 命令来部署其中所有服务。

Maven 部署命令会遍历项目每项服务以查找其配置文件,然后部署各项服务。

要使用 Maven 部署多项服务,请执行以下操作:

  1. 确保已将 appengine-maven-plugin 添加到父级 pom.xml 文件中。
  2. 运行以下命令:

    mvn appengine:deploy
    
使用 appcfg

Windows

appengine-java-sdk\bin\appcfg.cmd update [DEPLOYMENTS]

Mac / Linux

./appengine-java-sdk/bin/appcfg.sh update [DEPLOYMENTS]

其中 [DEPLOYMENTS] 是一个或多个配置文件的路径和名称。您可以使用单个空格来分隔您指定的每个配置文件。

示例:

Windows

appengine-java-sdk\bin\appcfg.cmd update [WAR_LOCATION] [SERVICE1_WAR_LOCATION] [MOD2_WAR_LOCATION]

Mac / Linux

./appengine-java-sdk/bin/appcfg.sh update [WAR_LOCATION] [SERVICE1_WAR_LOCATION] [MOD2_WAR_LOCATION]

每项服务成功部署后,您将通过命令行收到验证。

更新索引

要创建或更新应用所使用的索引,您可以将 datastore-indexes.xml 配置文件上传到 Cloud Datastore。上传该配置文件之后,系统将创建尚不存在的索引。

Cloud Datastore 可能需要一段时间才能创建所有索引,因此 App Engine 无法立即使用这些索引。如果您的应用已配置为接收流量,而查询需要的索引仍在构建过程中,则查询时可能会发生异常。

为避免发生异常,您必须留出时间来构建所有索引,例如:

如需详细了解索引,请参阅配置数据存储区索引

问题排查

下面是您可能会遇到的常见错误消息:

PERMISSION_DENIED: Operation not allowed
The "appengine.applications.create" permission is required.
如果 GCP 项目不包含所需的 App Engine 应用,则 gcloud app deploy 命令尝试运行 gcloud app create 命令时可能会失败。只有拥有所有者角色的帐号才具备创建 App Engine 应用所需的权限。
Command not found

如果您在安装 App Engine SDK 时没有为 appcfg.shdev_appserver.sh 工具创建符号链接,则可能需要指定完整目录路径来运行相应工具,例如:[PATH_TO_APP_ENGINE_SDK]/appcfg.sh[PATH_TO_APP_ENGINE_SDK]/dev_appserver.sh

Import Error

如果您同时安装了 Google Cloud SDK 以及 App Engine SDK 原始版本,则指向您的 PATH 的条目可能会相互冲突并造成导入错误。如果您在运行 Cloud SDK 命令时收到错误,请尝试明确使用 App Engine SDK 原始版本。您可以将 App Engine SDK 原始版本的条目移动到 PATH 中较为靠前的位置,以使相应命令具有优先权。或者,您也可以通过指定完整目录路径来运行相应命令:[PATH_TO_APP_ENGINE_SDK]/dev_appserver.sh
提示:在 Linux 或 Mac 上,您可以运行 which dev_appserver.py 来确定 PATH 中最靠前的 SDK。

[400] The first service (module) you upload to a new application must be the 'default' service (module)

您必须先部署和创建 default 服务,然后才能部署和创建应用的多项服务。如需详细了解如何将版本部署到 default 服务,请参阅部署多个服务应用

Too Many Versions (403)

App Engine 对应用的已部署版本数量设定了限制。针对免费应用和已部署应用的限制有所不同。您可以使用 GCP Console 删除较旧的版本,然后上传您的最新代码。

You do not have permission to modify this app (403)

经过身份验证的帐号没有权限部署到您的命令或 appengine-web.xml 中指定的应用 ID 时,就会发生上述情况。请检查您的应用 ID 是否正确以及该 ID 与 GCP Console 项目 ID 的值是否匹配。接下来,检查 Console 中的项目权限,并检查帐号是否列出且具有允许部署应用的足够权限级别。如果帐号权限和项目 ID 正确无误,您可以尝试通过从主目录中删除 .appcfg_oauth2_tokens 文件来强制重新验证 SDK,然后重试部署命令。

后续步骤

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Java 版 App Engine 标准环境