部署

部署 GWT 应用非常简单易行。编译器生成的输出只是一些 JavaScript 和 HTML 文件,以及其他公共资源(css、图像等)。您只需要将这些资源放到您的 Web 服务器上即可。如果您在服务器端使用 Java servlet 容器,部署应用也非常简单,特别是从 1.6 版本开始,GWT 采用了 WAR 风格的输出约定,遵循 Servlet 2.5 API 规范

本节介绍了 GWT 编译器生成的 GWT 应用文件,以及在您的 Web 服务器或 servlet 容器上部署这些资源以运行 GWT 应用的不同方法。在了解如何部署 GWT 应用之前,您还必须 了解 GWT 编译器,以及它生成的输出。

  1. 在 Web 服务器上部署
  2. 使用 RPC 在 servlet 容器上部署
  3. 在 Google App Engine 上部署

在 Web 服务器上部署

将 GWT 应用部署到 Web 服务器非常简单。您只需在编译后复制 生成的 GWT 应用文件,并在您的 Web 服务器上托管它们。当然,您还需要设置您的服务器端代码,这种设置可以采用多种形式:通过 JSONP处理 JSON 数据 进行通信,接收和解析通过 GWT RequestBuilder 发送的 HTTP 请求的服务器端脚本,或 GWT RPC(参见下文的“使用 RPC 在 servlet 容器上部署”部分)。

以将 GWT 应用文件部署到 Web 服务器为例,假设您想在 Web 服务器上部署 DynaTable 应用,从 /web/apps/dynatable_app/ 提供文件。在运行 GWT 编译器并在 war/dynatable 目录中生成输出后,您只需将主机 HTML 页面和样式表复制到 web/apps/dynatable_app/,并将 war/dynatable 子目录的内容复制到 /web/apps/dynatable_app/dynatable/。此时,应用程序已部署。但是,为了确保您的应用程序正常部署,您需要牢记以下几点:

  • 主机 HTML 页面实际上可以位于您的 Web 服务器上的任何位置。
  • 引导脚本也可以位于您的 Web 服务器上的任何位置。
  • GWT 应用文件必须与引导脚本位于同一目录,因为脚本根据其自身位置查找应用文件。
  • 主机 HTML 页面必须在其在 Web 服务器上的相应位置引用引导脚本。
  • 任何公共资源也可以放置在 Web 服务器上的任何位置,但这些资源应理想情况下镜像开发过程中相对于 war 文件夹的资源路径。否则,部署后对这些资源的引用可能无法保持(例如,一个 Image Widget 引用一些 .png 文件)。

使用 RPC 在 servlet 容器上部署

在 servlet 容器上部署 GWT 应用也是一个简单的过程。由于 GWT 编译器生成的输出目录结构已经符合 Servlet 2.5 API 规范,因此您可以直接从输出目录部署您的应用。但是,最好将输出复制并部署到 servlet 容器上的单独目录。

以 DynaTable 示例为例,部署您的项目将涉及将 GWT 编译器输出复制到 servlet 容器上的以下路径:

webapps/dynatable/DynaTable.html
webapps/dynatable/DynaTable.css
webapps/dynatable/dynatable/dynatable.nocache.js
// The rest of your GWT application files under webapps/dynatable/dynatable/

您还需要采取一些额外的步骤来确保您的应用程序已准备好部署到 servlet 容器。

类文件

由 webAppCreator 实用程序生成的构建脚本会自动处理编译您的 servlet 类并将它们放置到 war/WEB-INF/classes 文件夹中。但是,随着您对服务器端代码进行更改(这些更改不一定会在 GWT 客户端代码中产生更改),您的资源可能会不同步,因此您可能会忘记运行编译器以生成您的 servlet 类的新的 .class 文件。在这种情况下,您可以再次对您的应用程序代码运行构建脚本以生成新的 .class 文件,但简单的 javac 也足以胜任,而且编译时间可能更短。但是,如果 RPC 服务方法签名发生了更改,则您需要使用 GWT 编译器重新编译您的应用程序。

任何其他服务器端类也需要根据 Servlet API 规范放置到此目录中。

web.xml

您的应用程序中使用的任何 servlet(包括 GWT RPC servlet)都需要在 web.xml 文件中定义。在以前的版本中,GWT 要求您在模块 XML 文件中定义 servlet,以便它们在开发模式下得到解析。这种情况不再存在,web.xml 文件用于为开发模式和部署的生产模式配置 servlet。

lib 文件夹

lib 文件夹包含您的应用程序使用的各种库(通常是 JAR 和类文件)。在您的应用程序使用的各种服务器端库中,gwt-servlet.jar 也应该放在这里,如果您的应用程序使用的是 GWT RPCwebAppCreator 实用程序生成的 build.xml 配置文件应该会为您处理将此资源复制到 lib 目录。要将其他必需的库复制到 lib 文件夹,您可以手动添加它们,或者更新构建脚本以从项目类路径中复制库。

序列化策略文件

如果您使用的是 GWT RPC,GWT 编译器将在编译后生成一个 <md5>.gwt.rpc 序列化策略文件。为了使 GWT RPC 机制能够确定是否可以安全地序列化传递到 GWT RPC 服务中的类型,必须在您的 servlet 容器上部署此文件。序列化策略文件可以位于您的 webapp 应用目录中的任何位置,只要可以通过您的 RPC 服务中的 ServletContext.getResource() 调用检索到它即可。

如果您在应用程序中使用 GWT RPC,您可以查看有关 部署 RPC 服务 的文档以获取更多详细信息。

在 Google App Engine 上部署(Java 运行时)

注意:要了解将 GWT 应用部署到 Google App Engine 的步骤,请参阅教程 部署到 Google App Engine

Google App Engine 上部署您的应用只需要几个步骤。首先,您需要使用 GWT 编译器编译您的应用程序,以在标准 war 目录结构中生成应用文件,然后您可以使用 appcfg 实用程序上传和部署您的应用程序。

如果您使用 webAppCreator 创建了您的项目,您只需使用以下命令编译您的应用程序即可:

ant build

然后,您可以通过使用 update 选项调用 appcfg 实用程序,从 war 输出目录部署您的应用程序:

<appengine_home_dir>/appcfg.sh update war

您需要事先正确配置您的 appengine-web.xml,并确保您已创建了 Google App Engine 帐户和 GWT 应用的应用空间。您可以阅读 App Engine 文档 以获取更多信息。