このドキュメントでは、Java 8 アプリケーションを JAR ファイルとして再パッケージ化し、サポートされている Java ランタイムで実行する方法について説明します。サポートされている Java ランタイムを使用するには、Jetty などのサーバーを埋め込むか、Docker を使用してアプリケーションをコンテナ化してカスタム ランタイムを作成します。アプリケーションを完全に書き換える必要はありません。既存の WAR アプリケーションは、最新の Java プラットフォームまたはフレキシブルなクラウド環境で実行できます。デプロイ戦略とインフラストラクチャに最適な方法を、次の中から選択します。
Java 8 ウェブ アプリケーション(WAR ファイル)を準備する
Java 8 アプリケーションをサポートされている JAR ファイルとして再パッケージ化する前に、WAR ファイルをビルドする必要があります。このセクションでは、WAR ファイルをビルドする Java 8 アプリケーションのサンプルについて説明します。手順に沿って Java 8 の hello-world
アプリケーションを作成します。
ソース ディレクトリに
HelloServlet.java
ファイルを作成します。web.xml
デプロイ記述子ファイルを作成して、ウェブ アプリケーションを構成します。ランディング ページ
index.jsp
を作成するpom.xml
ファイルに次のコードを追加して、Java 8 アプリケーションのビルドを定義します。WAR のパッケージ構成:
<groupId>com.example</groupId> <artifactId>HelloWorldApp</artifactId> <version>1.0</version> <packaging>war</packaging>
maven.compiler
ソースとターゲットがバージョン1.8
に設定されたmaven-war-plugin
プラグイン:<properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <java.version>8</java.version> </properties>
javax.servlet-api
の依存関係:<dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> </dependencies>
Maven の構成:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>${maven.compiler.source}</source> <target>${maven.compiler.target}</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.3.2</version> </plugin> </plugins> </build>
プロジェクト ディレクトリの構造は次のようになります。
├── pom.xml └── src └── main ├── java │ └── com │ └── example │ └── HelloServlet.java └── webapp ├── WEB-INF │ └── web.xml └── index.jsp
アプリケーションのプロジェクト ディレクトリで
mvn install
を実行して、ターゲット ディレクトリに WAR ファイルHelloWorldApp-1.0.war
を生成します。
Dockerfile を使用してアプリケーションをデプロイする(推奨)
カスタム ランタイムは、App Engine カスタム ランタイムなどのカスタム コンテナをサポートするプラットフォームに適しています。カスタム ランタイムを使用するとランタイム環境を構成できるため、柔軟性が向上します。カスタム ランタイムのデプロイのチュートリアルの例については、App Engine フレキシブル環境でカスタム ランタイム アプリを作成するをご覧ください。
次の手順では、Dockerfile を使用して Java 8 アプリケーションをコンテナ化する方法について説明します。
コンテナ イメージをビルドして Artifact Registry に push する
このセクションでは、Cloud Build を使用して Docker イメージをビルドし、Artifact Registry リポジトリに push する方法について説明します。アプリケーションのコンテナ イメージを作成する手順は次のとおりです。
ソース ディレクトリに
cloudbuild.yaml
ファイルを作成して Docker イメージをビルドし、Artifact Registry に push します。steps: # Step 1: Build the Docker image - name: "gcr.io/cloud-builders/docker" args: - "build" - "-t" - "$LOCATION-docker.pkg.dev/$PROJECT/$REPOSITORY/SERVICE:VERSION" - "." # Step 2: Push the Docker image to Artifact Registry - name: "gcr.io/cloud-builders/docker" args: - "push" - "$LOCATION-docker.pkg.dev/$PROJECT/$REPOSITORY/SERVICE:VERSION" images: - "$LOCATION-docker.pkg.dev/$PROJECT/$REPOSITORY/SERVICE:VERSION"
次のように置き換えます。
- LOCATION は、アプリをデプロイする Google Cloud リージョンに置き換えます。
- PROJECT: 実際の Google Cloud プロジェクト ID。
- REPOSITORY: Artifact Registry リポジトリの名前。
- IMAGE は、コンテナ イメージの URL に置き換えます。
- TAG は、コンテナ イメージのタグに置き換えます。
次の構成の Dockerfile を作成します。
Docker をダウンロードしてインストールし、サンプルアプリをテストして、ローカルマシンで Hello World コンテナを実行します。
アプリケーション コンテナ イメージをビルドして Artifact Registry に push します。
gcloud builds submit .
アプリケーションをデプロイする
App Engine アプリケーションをデプロイするには:
ソース ディレクトリでカスタム ランタイムを使用するように
app.yaml
ファイルを構成します。プロジェクト ディレクトリの構造は次のようになります。
├── Dockerfile ├── README.md ├── app.yaml ├── cloudbuild.yaml ├── pom.xml └── src └── main ├── java │ └── com │ └── example │ └── HelloServlet.java └── webapp ├── WEB-INF │ └── web.xml └── index.jsp
gcloud app deploy
コマンドを使用してアプリケーションをデプロイします。gcloud app deploy --image-url=REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE:tag
次のように置き換えます。
- LOCATION は、アプリをデプロイする Google Cloud リージョンに置き換えます。
- PROJECT: 実際の Google Cloud プロジェクト ID。
- REPOSITORY: Artifact Registry リポジトリの名前。
- IMAGE は、コンテナ イメージの URL に置き換えます。
- TAG は、コンテナ イメージのタグに置き換えます。
埋め込み Java ランタイムを使用する
次の手順は、埋め込みサーバー(Jetty)を使用して App Engine Java 8 アプリケーションを再パッケージ化し、サポートされている Java ランタイムでスタンドアロン JAR として実行する方法です。
埋め込み Jetty サーバーを作成する
アプリケーションの WAR ファイルを埋め込み Jetty サーバーとバンドルする手順は次のとおりです。
Main
クラスを作成して、WAR ファイルを実行するように Jetty サーバーを初期化して構成します。Main
クラスでは、デフォルトが8080
のサーバーポートが設定されます。PORT
環境変数で指定されたポートを使用するようにソースコードを変更することもできます。Main
クラスでは、WAR ファイルを提供するようWebAppContext
ハンドラが構成されます。Maven プロジェクト ファイル
pom.xml
を作成し、次の構成を追加します。maven.compiler.source
プロパティとmaven.compiler.target
プロパティを、サポートされている Java ランタイムに設定します。Jetty の依存関係を追加します。
maven-assembly-plugin
プロパティをパッケージの依存関係に構成します。
プロジェクト ディレクトリの構造は次のようになります。
├─src │ └─main │ └─java │ └─jetty │ └─Main.java └─pom.xml
Jetty ランナー プロジェクト ディレクトリで
mvn install
コマンドを実行します。これにより、ターゲット ディレクトリにjetty-jar-with-dependencies.jar
が生成されます。Java 8 ウェブ アプリケーション(WAR ファイル)を準備するの手順で WAR ファイルを作成します。
Jetty が埋め込まれた WAR ファイルを実行してアプリケーションをデプロイする
このセクションでは、アプリケーションを実行可能な JAR ファイルにパッケージ化する手順について説明します。アプリケーションをパッケージ化してデプロイする手順は次のとおりです。
生成された Jetty ランナー JAR
jetty-jar-with-dependencies.jar
とアプリケーションの WAR ファイルHelloWorldApp-1.0.war
を同じディレクトリに配置します。サポートされている Java ランタイムを使用してアプリケーションを実行します。
java -jar jetty-jar-with-dependencies.jar HelloWorldApp-1.0.war
- ウェブブラウザで http://localhost:8080/ に移動します。アプリケーションのスタートページが表示されます。
entrypoint
要素をapp.yaml
ファイルに作成してjetty-jar-with-dependencies
オブジェクトを呼び出し、WAR ファイルを引数として渡します。WAR ファイルで指定するバージョンは、pom.xml
ファイルと同じバージョンである必要があります。gcloud app deploy
コマンドを使用してアプリケーションをデプロイします。