Java 8 / Jetty 9 运行时

Eclipse Jetty 9 运行时使用 OpenJDK 8 和 Jetty 9,并且支持 Java Servlet 3.1 规范。

前提条件

  • 下载最新版本的 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.0.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

这些命令行会在 Docker 容器的正确位置添加 WAR。

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

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

可选文件

以下配置文件为可选项:

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

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

您可以在 webapp/ 目录中放置静态网页内容以及 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_ARGSname=value 对的逗号分隔列表
JETTY_MODULES_ENABLE 模块的逗号分隔列表,可通过附加到 $JETTY_ARGS 来启用
JETTY_MODULES_DISABLE 模块的逗号分隔列表,可通过从 $JETTY_BASE/start.d 中移除来禁用
JETTY_ARGS 传递给 Jetty 的 start.jar 的参数。用于自定义 Jetty 配置的任何参数都应该在此传递。
JAVA_OPTS JVM 运行时参数

增强版 Stackdriver Logging(测试版)

在 App Engine 柔性环境中运行时,您可以通过设置 JETTY_ARGS 环境变量来配置 Java Util Logging,以将日志发送到 Google Stackdriver 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 appengine:deploy

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 文件的名称。

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

发送以下问题的反馈:

此网页
Java 版 App Engine 柔性环境文档