Java 執行階段

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_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

請參閱 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

您必須提供以下列方式設定 LoggingHandlerlogging.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.yamlcron.yamldispatch.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