このドキュメントでは、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.jspgcloud 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.xmlJetty ランナー プロジェクト ディレクトリで
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コマンドを使用してアプリケーションをデプロイします。