Java 8 / Jetty 9 运行时

Java 8 / Jetty 9 运行时为 OpenJDK 8 和 Eclipse Jetty 9 提供对 Java Servlet 3.1 规范的支持。如需了解此运行时的特定 Jetty 版本,请查看 GitHub 项目中的 Jetty 属性以获取运行时映像。

前提条件

  • 下载最新版本的 Google Cloud SDK,或者将您的 Cloud SDK 更新至最新版本:

    gcloud components update
    
  • 如需使用 Maven 进行部署,您需要将 App Engine Maven 插件添加到 pom.xml 中,如下所示:

    <plugin>
       <groupId>com.google.cloud.tools</groupId>
       <artifactId>appengine-maven-plugin</artifactId>
       <version>2.2.0</version>
    </plugin>

    您还可有 gcloud app deploy 命令或 App Engine Gradle 插件等其他部署选项。

整理文件

您的源代码树应如下所示:

MyDir/
  [pom.xml]
  [build.gradle]
  [index.yaml]
  [cron.yaml]
  [dispatch.yaml]
  src/main/
    appengine/
      app.yaml
    docker/
      [Dockerfile]
    java/
      com.example.mycode/
        MyCode.java
    webapp/
      [index.html]
      [jsp.jsp]
      WEB-INF/
        [web.xml]

app.yaml

需要 app.yaml 文件。定义如下所示的文件:

runtime: java
env: flex

handlers:
- url: /.*
  script: this field is required, but ignored

当您部署 WAR(*.war 文件)时,系统会自动选择运行时映像 gcr.io/google-appengine/jetty

如果要将此映像用作自定义运行时的基础,则可以在 app.yaml 文件中指定 runtime: custom,然后按如下所示编写相应的 Dockerfile 内容:

FROM gcr.io/google-appengine/jetty
ADD your-application.war $APP_DESTINATION

这些命令行会将 WAR 文件添加到 Docker 容器的正确位置。

如需了解其他 app.yaml 设置,请参阅使用 app.yaml

pom.xml 用于配置 Maven,而 build.gradle 用于配置 Gradle。

可选文件

以下配置文件为可选项:

请将这些文件置于 MyDir 的顶层。如果要使用其中的任何文件,您必须使用 gcloud app deploy 命令对其进行单独部署。

如果您未使用 Servlet 3.x 注释,则需要可选的 web.xml 文件。

您可以在 webapp/ 目录中放置静态 Web 内容以及 JavaServer 页面。App Engine 柔性环境使用 Jetty 9 作为其 Servlet 容器;Jetty 9 使用 Apache Jasper 作为默认 JSP 实现,并且包含 JSTL 标记库。

Dockerfile 文件是可选项,用于自定义 Java 运行时。

启用 gzip 压缩

gzip 处理程序是 Jetty 的捆绑模块,但默认情况下不会激活。如需激活此模块,请在 app.yaml 文件中设置环境变量 JETTY_MODULES_ENABLE=gzip

env_variables:
  JETTY_MODULES_ENABLE: 'gzip'

使用快速启动

通过预扫描应用内容并生成配置文件,Jetty 可以加快应用的启动时间。 如果您使用的是扩展映像,则可以在添加应用 WAR 文件后,在 Dockerfile 中执行 /scripts/jetty/quickstart.sh 命令激活快速启动:

FROM launcher.gcr.io/google/jetty
ADD your-application.war $JETTY_BASE/webapps/root.war

# generate quickstart-web.xml
RUN /scripts/jetty/quickstart.sh

环境变量

您可以设置以下专用于 Java 8 / Jetty 9 运行时的可选环境变量。您也可以设置 OpenJDK 8 环境变量

如需设置环境变量,请在 app.yaml 文件中使用 env_variables 键。

环境变量 Maven Prop 值/备注
JETTY_PROPERTIES 附加到 $JETTY_ARGS,采用 name=value 对格式的逗号分隔列表
JETTY_MODULES_ENABLE 附加到 $JETTY_ARGS,需要启用的逗号分隔模块列表
JETTY_MODULES_DISABLE $JETTY_BASE/start.d 中移除,需要禁用的逗号分隔模块列表
JETTY_ARGS 传递给 Jetty 的 start.jar 文件的参数。用于自定义 Jetty 配置的任何参数都应该通过此变量传递。
JAVA_OPTS JVM 运行时参数

增强型 Cloud Logging(Beta 版)

在 App Engine 柔性环境中运行时,您可以通过设置 JETTY_ARGS 环境变量来配置 Java Util Logging,以将日志发送到 Google Logging。例如:

 env_variables:
   JETTY_ARGS: -Djava.util.logging.config.file=WEB-INF/logging.properties

您必须提供一个以如下方式配置 LoggingHandler 对象的 logging.properties 文件:

handlers=com.google.cloud.logging.LoggingHandler

# Optional configuration
.level=INFO
com.google.cloud.logging.LoggingHandler.level=FINE
com.google.cloud.logging.LoggingHandler.log=gae_app.log
com.google.cloud.logging.LoggingHandler.formatter=java.util.logging.SimpleFormatter
java.util.logging.SimpleFormatter.format=%3$s: %5$s%6$s

本地测试

当您在本地环境进行测试时,可以使用模拟的 Google Cloud 服务,而非远程 Google Cloud 服务。您可以使用的模拟器包括:

在运行应用之前,请使用 gcloud 命令启动它们:

gcloud beta emulators datastore start
gcloud beta emulators pubsub start
gcloud beta emulators bigtable start

Maven

在 maven pom.xml 文件中插入以下配置行,以添加 Jetty 9 Maven 插件

<plugin>
  <groupId>org.eclipse.jetty</groupId>
  <artifactId>jetty-maven-plugin</artifactId>
  <version>9.4.2.v20170220</version>
</plugin>

如需在本地运行您的应用,请使用 Maven 命令:

mvn jetty:run-exploded

Gradle

按照创建新的 Gradle 项目中的说明,将 Gretty Gradle 插件添加到 build.gradle 文件,然后使用以下命令:

gradle jettyRun

部署应用

如需初始化 Google Cloud SDK,请运行以下命令:

gcloud init

完成配置后,您可以运行以下命令,使用 Google Cloud SDK 部署包含 app.yaml 和 WAR 文件的目录:

gcloud app deploy app.yaml

如果您使用了可选的配置文件(index.yamlcron.yamldispatch.yaml),请务必使用 gcloud 命令单独对其进行部署。例如:

gcloud app deploy cron.yaml

Maven

使用 Maven 部署应用:

mvn package appengine:deploy -Dapp.deploy.projectId=PROJECT_ID

PROJECT_ID 替换为您的 Cloud 项目 ID。如果您的 pom.xml 文件已经指定了您的项目 ID,则您无需在运行的命令中添加 -Dapp.deploy.projectId 属性。

Gradle

使用 Gradle 部署应用:

gradle appengineDeploy

自定义 Java 8 / Jetty 9 运行时

您不需要 Dockerfile 文件,就可以将应用部署到 Java 8 / Jetty 9 运行时。 不过,如果您的应用需要额外配置,您可以明确提供一个 Dockerfile 文件,在其中自定义 Java 运行时。请注意,Dockerfile 文件必须包含基本映像 gcr.io/google-appengine/jetty。您可以将其他指令添加到 Dockerfile,以自定义 Java 运行时。请参阅构建自定义运行时

您的 Dockerfile 文件开头应如下所示:

FROM gcr.io/google-appengine/jetty
ADD your-application.war $APP_DESTINATION
# YOUR DOCKER COMMANDS

在这种情况下,your-application.wartarget/ 目录 (maven) 或 build/staged-app/ (gradle) 目录中构建的 WAR 文件的名称。