Java 執行階段是軟體堆疊,負責安裝應用程式的程式碼和依附元件,然後在彈性環境中執行該應用程式。
Java 版本
Java 25 (預覽版) 使用建構套件。建構套件可協助您建構及設定容器,以便部署至 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 24 上指定 Java 25 (預先發布版):
runtime: java env: flex runtime_config: operating_system: "ubuntu24" runtime_version: "25"如要在 Ubuntu 24 上指定最新支援的 Java 版本,請按照下列步驟操作:
runtime: java env: flex runtime_config: operating_system: "ubuntu24"
舊版執行階段
如果是 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: openjdk8Java 8 的範例
app.yaml:
如要設定 Maven,請參閱 pom.xml;如要設定 Gradle,請參閱 build.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 環境變數,將 Java Util Logging 設為將記錄傳送至 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 替換為 Google Cloud 專案 ID。如果 pom.xml 檔案已指定專案 ID,則不需要在執行的指令中加入 -Dapp.deploy.projectId 屬性。
Gradle
使用 Gradle 部署應用程式:
gradle appengineDeploy