Java 8 ランタイム

Java 8 ランタイムには、ウェブサービス用フレームワークは含まれていません。唯一の要件は、アプリがポート 8080 をリッスンし、応答することです。ここに示すサンプルコードは、Spring Boot などの独自のフレームワークを Java 8 ランタイムに追加する方法を示しています。

前提条件

  • 開発を始める前に、Google Cloud CLI の最新バージョンをダウンロードするか、gcloud CLI を最新のバージョンに更新します。

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

    <plugin>
       <groupId>com.google.cloud.tools</groupId>
       <artifactId>appengine-maven-plugin</artifactId>
       <version>2.7.0</version>
    </plugin>

    デプロイには、gcloud app deploy コマンドや App Engine Gradle プラグインの使用などの他のオプションがあります。

  • アプリケーション フレームワークの手順で、実行可能 JAR ファイルのビルドを構成します。この実行可能 JAR は java -jar app.jar を介して実行する必要があります。たとえば、Spring Boot のドキュメントなどを確認してください。

ファイルの整理

ファイル階層は次のようになります。

MyDir/
  pom.xml
  [index.yaml]
  [cron.yaml]
  [dispatch.yaml]
  src/main/
    appengine/
      app.yaml
    docker/
      Dockerfile
    java/
      com.example.mycode/
        MyCode.java

app.yaml

app.yaml ファイルは必須です。次のようなファイルを定義します。

runtime: java
env: flex

runtime: java を指定した場合、JAR(*.jar)ファイルをデプロイすると、ランタイム イメージ gcr.io/google-appengine/openjdk:8 が自動的に選択されます。

JDK バージョンを選択するには、runtime_config.jdk フィールドを使用します。

runtime: java
env: flex
runtime_config:
  jdk: openjdk8

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

オプションのファイル

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

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

デフォルトのエントリ ポイント

OpenJDK 8 イメージのエントリ ポイントは docker-entrypoint.bash です。これは、渡されたコマンドライン引数を処理して実行可能な代替を探すか、デフォルト コマンド(java)に対する引数を探します。

イメージに対する最初の引数が実行可能ではない場合、java コマンドが暗黙的に追加されます。例:

$ docker run openjdk -jar /usr/share/someapplication.jar

イメージに対する最初の引数が実行可能である場合(bash など)、そのコマンドが実行されます。

たとえば、以下を使用してシェルを実行できます。

> docker run -it --rm openjdk bash
root@c7b35e88ff93:/#

環境変数

環境変数を設定するには、app.yaml ファイルの env_variables キーを使用します。例:

env_variables:
   MY_VAR_COLOR: 'blue'

次の表には、機能の有効化、無効化、または構成を行うために使用できる環境変数が示されています。

環境変数 説明 デフォルト
TMPDIR 一時ディレクトリ ディレクトリ名
JAVA_TMP_OPTS JVM 一時ディレクトリ引数 JVM 引数 -Djava.io.tmpdir=${TMPDIR}
GAE_MEMORY_MB 利用可能なメモリ サイズ Google App Engine または /proc/meminfo - 400M で設定します。
HEAP_SIZE_RATIO ヒープ用メモリ パーセント 80
HEAP_SIZE_MB 使用可能なヒープ サイズ ${HEAP_SIZE_RATIO}% / ${GAE_MEMORY_MB}
JAVA_HEAP_OPTS JVM ヒープ引数 JVM 引数 -Xms${HEAP_SIZE_MB}M -Xmx${HEAP_SIZE_MB}M
JAVA_GC_OPTS JVM GC の引数 JVM 引数 -XX:+UseG1GC と構成
JAVA_USER_OPTS JVM のその他の引数 JVM 引数
JAVA_OPTS JVM 引数 JVM 引数 以下を参照
SHUTDOWN_LOGGING_THREAD_DUMP シャットダウン スレッドダンプ ブール値 false
SHUTDOWN_LOGGING_HEAP_INFO シャットダウン ヒープ情報 ブール値 false
SHUTDOWN_LOGGING_SAMPLE_THRESHOLD シャットダウン サンプリング パーセント 100

明示的に設定されていない場合、JAVA_OPTS はデフォルトで JAVA_OPTS:=-showversion \ ${JAVA_TMP_OPTS} \ ${DBG_AGENT} \ ${JAVA_HEAP_OPTS} \ ${JAVA_GC_OPTS} \ ${JAVA_USER_OPTS} に設定されます。

実行されるコマンドラインは、実質的には次のようになります($@ は Docker のエントリ ポイントに渡される引数です)。

java $JAVA_OPTS "$@"

ローカルテスト

次を使用して、アプリをビルドできます。

mvn package

java コマンドラインを使用して実行します。

java -jar target/myjar.jar

または、アプリをローカルで実行する方法に関して、アプリケーション フレームワークの手順を行います。

ローカル環境でテストする際に、リモートの Google クラウド サービスではなくエミュレートされた Google クラウド サービスを使用することもできます。DatastorePub/SubBigtable のエミュレータが用意されています。アプリを実行する前に gcloud コマンドを使用して起動します。

gcloud beta emulators datastore start
gcloud beta emulators pubsub start
gcloud beta emulators bigtable start

アプリのデプロイ

構成が完了したら、Google Cloud CLI を使用して app.yaml ファイルと JAR を含むこのディレクトリをデプロイできます。

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

Gradle

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

gradle appengineDeploy

Java 8 ランタイムのカスタマイズ

Dockerfile は、アプリを Java 8 ランタイムにデプロイするために必要ではありません。ただし、アプリで追加構成が必要な場合、Dockerfile を明示的に指定して、Java ランタイムをカスタマイズできます。

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

FROM gcr.io/google-appengine/openjdk:8
COPY your-application.jar $APP_DESTINATION

上記のラインによって、Docker コンテナの正しい場所に JAR が追加されます。

追加のディレクティブを Dockerfile に追加し、Java ランタイムをカスタマイズできます。カスタム ランタイムをビルドするをご覧ください。