Java 8 / Jetty 9 运行时为 OpenJDK 8 和 Eclipse Jetty 9 提供对 Java Servlet 3.1 规范的支持。如需了解此运行时的特定 Jetty 版本,请查看 GitHub 项目中的 Jetty 属性以获取运行时映像。
前提条件
下载最新版本的 Google Cloud CLI 或者将 gcloud CLI 更新至当前版本:
gcloud components update
如需使用 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]
app.yaml
需要 app.yaml
文件。请按如下所示定义该文件:
当您部署 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 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 替换为您的 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.war
是 target/
目录 (maven) 或 build/staged-app/
(gradle) 目录中构建的 WAR 文件的名称。