Java 執行階段是軟體堆疊,負責安裝應用程式的程式碼和依附元件,然後在彈性環境中執行該應用程式。
Java 版本
Java 21 使用建構套件。建構套件可協助您建構及設定容器,以便部署至 Google Cloud。
如需支援的 Java 版本完整清單,以及對應的 Ubuntu 版本,請參閱執行階段支援時間表。
如要使用支援的 Java 版本,請按照下列步驟操作:
安裝 420.0.0 以上版本的 gcloud CLI。您可以執行
gcloud components update
指令,更新 CLI 工具。如要查看已安裝的版本,可以執行gcloud version
指令。如要使用 Maven 進行部署,您必須在
pom.xml
中新增 App Engine Maven 外掛程式:<plugin> <groupId>com.google.cloud.tools</groupId> <artifactId>appengine-maven-plugin</artifactId> <version>2.8.1</version> </plugin>
其他部署選項包括
gcloud app deploy
指令或 App Engine Gradle 外掛程式。在
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
:
請參閱 pom.xml
設定 Maven,以及 build.gradle
設定 Gradle。
選用檔案
下列為選用的設定檔:
將這些檔案放在 MyDir 的頂層。如果您使用這些檔案,請務必使用 gcloud app deploy
指令分別部署。
web.xml
為選用項目,只有在未使用 Servlet 3.x 註解時才需要。
您可以將靜態網頁內容和 JavaServer 網頁放在 webapp/
目錄中。App Engine 彈性環境用做 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 屬性 | 值/註解 |
---|---|---|
JETTY_PROPERTIES |
以半形逗號分隔的 name=value 配對清單,附加至 $JETTY_ARGS |
|
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
環境變數,將記錄傳送至 Cloud 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
支援其他 Java 執行階段
如需使用不支援的 Java 版本,可以建立自訂執行階段,並選取含有所需 Java 版本的有效基本映像檔。
如要瞭解 Google 提供的基本映像檔或 Docker Java 基本映像檔,請參閱「建構自訂執行階段」。
整理您的檔案
來源樹狀結構看起來應該像這樣:
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]
本機測試
在本機環境中測試時,您可以使用模擬 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 替換為專案 ID。 Google Cloud 如果 pom.xml
檔案已指定專案 ID,則不需要在執行的指令中加入 -Dapp.deploy.projectId
屬性。
Gradle
使用 Gradle 部署應用程式:
gradle appengineDeploy