Java 8 / Jetty 9 ランタイム

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

要件

  • Google 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.2.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 です。Apache Jasper をデフォルトの JSP 実装として使用する Jetty 9 は、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 フレキシブル環境で実行する場合は、JETTY_ARGS 環境変数を設定して、Cloud Logging にログを送信するように Java Util 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 SDK を初期化するには、次のコマンドを実行します。

gcloud init

構成が完了したら、Google 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 ファイルの名前です。