Java 8 / Jetty 9 ランタイム

Java 8 / Jetty 9 ランタイムには、Java サーブレット 3.1 仕様をサポートする OpenJDK 8 と Eclipse Jetty 9 が用意されています。このランタイムの特定の Jetty バージョンについては、ランタイムのイメージに関する GitHub プロジェクトの Jetty プロパティをご覧ください。

前提条件

  • Cloud SDK の最新バージョンをダウンロードするか、Cloud SDK を現在のバージョンに更新します。

    gcloud components update
    
  • Maven を使用してデプロイするには、App Engine Maven プラグインpom.xml に追加する必要があります。

    <plugin>
       <groupId>com.google.cloud.tools</groupId>
       <artifactId>appengine-maven-plugin</artifactId>
       <version>2.4.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 ファイルは必須です。次のようなファイルを定義します。

runtime: java
env: flex

handlers:
- url: /.*
  script: this field is required, but ignored

WAR(*.war ファイル)をデプロイすると、ランタイム イメージ gcr.io/google-appengine/jetty が自動的に選択されます。

このイメージをカスタム ランタイムのベースとして使用する場合は、app.yaml ファイルで runtime: custom を指定し、Dockerfile を次のように記述します。

FROM gcr.io/google-appengine/jetty
ADD your-application.war $APP_DESTINATION

上記の行により、Docker コンテナの正しい場所に WAR が追加されます。

その他の app.yaml の設定については、app.yaml の使用をご覧ください。

pom.xml は Maven を構成するためのファイルであり、build.gradle は Gradle を構成するためのファイルです。

オプションのファイル

次の構成ファイルはオプションです。

これらのファイルを MyDir の最上位に配置します。これらのファイルを使用する場合は、gcloud app deploy コマンドを使用して個別にデプロイする必要があります。

web.xml はオプションであり、Servlet 3.x アノテーションを使用していない場合にのみ必要です。

静的ウェブ コンテンツと JavaServer ページを webapp/ ディレクトリに配置できます。App Engine フレキシブル環境でサーブレット コンテナとして使用するのは Jetty 9 です。Jetty 9 は Apache Jasper をデフォルトの JSP 実装として使用し、JSTL taglib を含みます。

Dockerfile ファイルはオプションであり、Java ランタイムをカスタマイズする場合に使用されます。

gzip 圧縮を有効にする

gzip ハンドラは Jetty にバンドルされていますが、デフォルトでは有効になっていません。このモジュールを有効にするには、app.yaml ファイルに環境変数 JETTY_MODULES_ENABLE=gzip を設定します。

env_variables:
  JETTY_MODULES_ENABLE: 'gzip'

クイックスタートを使用する

Jetty では、アプリケーションの内容を事前にスキャンし、構成ファイルを生成することでアプリケーションの開始にかかる時間を短縮できます拡張イメージを使用している場合は、Dockerfile でアプリケーション WAR を追加した後に /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 プロパティ 値/コメント
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(ベータ版)

App Engine フレキシブル環境での実行時に、Cloud Logging にログを送信するように Java Util Logging を構成できます。このためには、JETTY_ARGS 環境変数を設定します。次に例を示します。

 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

アプリのデプロイ

Cloud SDK を初期化するには、次のコマンドを実行します。

gcloud init

構成が完了したら、Cloud SDK を使用して 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 は実際の Cloud プロジェクトの ID に置き換えます。pom.xml ファイルですでにプロジェクト ID を指定している場合は、実行するコマンドに -Dapp.deploy.projectId プロパティを含める必要はありません。

Gradle

Gradle を使用してアプリをデプロイします。

gradle appengineDeploy

Java 8 / Jetty 9 ランタイムをカスタマイズする

Java 8 / Jetty 9 ランタイムへのアプリのデプロイでは、Dockerfile は不要です。アプリに追加の構成が必要な場合は、Dockerfile を明示的に提供して Java ランタイムをカスタマイズできます。Dockerfile にはベースイメージ gcr.io/google-appengine/jetty が含まれている必要があります。追加のディレクティブを Dockerfile に追加し、Java ランタイムをカスタマイズできます。カスタム ランタイムの構築をご覧ください。

Docker ファイルの開始部分は次のようになります。

FROM gcr.io/google-appengine/jetty
ADD your-application.war $APP_DESTINATION
# YOUR DOCKER COMMANDS

この場合、your-application.wartarget/ ディレクトリ(maven)または build/staged-app/(gradle)にあるビルド済み WAR ファイルの名前です。