Java 运行时

Java 运行时是负责安装应用代码和依赖项,然后在柔性环境中运行该应用的软件栈。

  • 11 版及更高版本使用 Buildpack 构建,要求您在 app.yaml 文件中选择操作系统。例如,如需使用 Java 21,您必须指定 Ubuntu 22 作为操作系统。

  • Java 8 / Jetty 9 运行时为 OpenJDK 8 和 Eclipse Jetty 9 提供对 Java Servlet 3.1 规范的支持。Jetty 映像继承自 OpenJDK 映像。

如需查看受支持的 Java 版本及其对应的 Ubuntu 版本的完整列表,请参阅运行时支持时间表

前提条件

如需使用 Java 运行时,请执行以下操作:

  • 您必须安装 gcloud CLI 420.0.0 版或更高版本。您可以通过运行 gcloud components update 命令来更新 CLI 工具。如需查看已安装的版本,您可以运行 gcloud version 命令。

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

    <plugin>
       <groupId>com.google.cloud.tools</groupId>
       <artifactId>appengine-maven-plugin</artifactId>
       <version>2.7.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]

选择 Java 版本

新运行时版本

对于 Java 运行时版本 11 版及更高版本,您必须在 app.yaml 文件中添加 runtime_configoperating_system 设置以指定操作系统。

(可选)您可以通过在 app.yaml 文件中添加 runtime_version 设置来指定运行时版本。默认情况下,如果未指定 runtime_version 设置,则使用最新的 Java 版本。

示例

  • 如需在 Ubuntu 22 上指定 Java 21,请运行以下命令:

    runtime: java
    env: flex
    
    runtime_config:
        operating_system: "ubuntu22"
        runtime_version: "21"
    
  • 如需在 Ubuntu 22 上指定受支持的最新 Java 版本,请运行以下命令:

      runtime: java
      env: flex
    
      runtime_config:
          operating_system: "ubuntu22"
    

过往运行时版本

对于 Java 8,请在 app.yaml 文件中指定 runtime_configjdk 设置。

Java 8 支持:

  • Eclipse Jetty 9 运行时,并使用 Servlet 3.1 运行 Jetty 9。
  • 您自己的服务器代码,作为应用的一部分侦听端口 8080。此功能允许您使用 SparkJavaSpring-Boot 等微服务框架。

示例

  • 指定 Jetty 版本 9(默认 / 可选):

      runtime_config:
        jdk: openjdk8
        server: jetty9
    
  • 指定 Java 8 版:

      runtime_config:
        jdk: openjdk8
    
  • Java 8 版 app.yaml 示例:

    runtime: java
    env: flex
    
    handlers:
    - url: /.*
      script: this field is required, but ignored

如需了解如何配置 Maven,请参阅 pom.xml;如需了解如何配置 Gradle,请参阅 build.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 命令激活快速启动:

环境变量

您可以设置以下专用于 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 CLI,请运行以下命令:

gcloud init

完成配置后,您可以运行以下命令,使用 Google Cloud CLI 部署包含 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 替换为您的 Google Cloud 项目的 ID。 如果您的 pom.xml 文件已经指定了您的项目 ID,则您无需在运行的命令中添加 -Dapp.deploy.projectId 属性。

Gradle

使用 Gradle 部署应用:

gradle appengineDeploy

自定义 Java 8 / Jetty 9 运行时

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

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