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_config
和 operating_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_config
和 jdk
设置。
Java 8 支持:
- Eclipse Jetty 9 运行时,并且使用 Servlet 3.1 运行 Jetty 9。
- 您自己的服务器代码作为应用的一部分来监听端口 8080。此功能允许您使用 SparkJava 和 Spring-Boot 等微服务框架。
示例
指定 Jetty 版本 9(默认值/可选):
runtime_config: jdk: openjdk8 server: jetty9
指定 Java 8 版:
runtime_config: jdk: openjdk8
Java 8 版
app.yaml
示例:
如需了解如何配置 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
您必须提供一个以如下方式配置 logging.properties 对象的 LoggingHandler 文件:
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.yaml
、cron.yaml
和 dispatch.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.war
是 target/
目录 (maven) 或 build/staged-app/
(gradle) 目录中构建的 WAR 文件的名称。