Heroku Maven プラグインを使用した Java アプリケーションのデプロイ
最終更新日 2023年02月06日(月)
Table of Contents
Git デプロイに加えて、Heroku は API を介したアプリのビルドおよびリリースをサポートします。Heroku Maven プラグインはこの API を使用して、事前パッケージ済みスタンドアロン Web アプリケーションの直接デプロイを Heroku に提供します。
この方法は、コンパイルに時間がかかったり、Travis CI や Jenkins などの継続的インテグレーション サーバーからデプロイする必要があったりするアプリケーションにとっては推奨される方法となる場合があります。
この記事では、Heroku Maven プラグインをプロジェクトに組み込んで設定し、アプリケーションを Heroku にデプロイする方法について学びます。
プラグインの追加
プラグインをプロジェクトに組み込むには、pom.xml
ファイルに次のコードを追加します。
<project>
...
<build>
...
<plugins>
<plugin>
<groupId>com.heroku.sdk</groupId>
<artifactId>heroku-maven-plugin</artifactId>
<version>3.0.7</version>
</plugin>
</plugins>
</build>
</project>
その後、次のコードを実行して新しい Heroku アプリケーションを作成します。
$ heroku create
アプリケーションが Git でバージョン管理されている場合、プラグインはアプリケーション名をデフォルトで検出します。Git を使用していない場合、この設定をプラグインに追加する必要があります (ただし、アプリ名をご使用のアプリの名前に置き換えてください)。
<configuration>
<appName>sushi</appName>
</configuration>
アプリケーションが WAR ファイルとしてパッケージ化されている場合はこの設定で十分ですが、アプリケーションがスタンドアロンの Java アプリケーションの場合はプロセスタイプを定義する必要があります。
プロセスタイプはアプリケーションを開始するときに使用されるコマンドです。これらはプロセスタイプおよび Procfileの記事に記載されているように、Procfile
を使用して設定できます。または、次に示すように、pom.xml
に直接設定できます。
<configuration>
...
<processTypes>
<web>java $JAVA_OPTS -cp target/classes:target/dependency/* Main</web>
</processTypes>
</configuration>
上記の設定により、Main
クラスを使用して Web プロセスを開始するよう Heroku に通知されます。プロセスタイプはアプリケーションコードによって異なります。
これでデプロイできます。
プラグインを使用したデプロイ
アプリケーションが WAR としてパッケージ化されている場合、次のコマンドで slug を作成して Heroku にデプロイできます。
$ mvn clean heroku:deploy-war
...
[INFO] -----> Packaging application...
[INFO] - app: obscure-sierra-7788
[INFO] - including: ./target/dependency/webapp-runner.jar
[INFO] - including: ./target/my-app.war
[INFO] -----> Creating build...
[INFO] - file: target/heroku/slug.tgz
[INFO] - size: 1MB
[INFO] -----> Uploading build...
[INFO] - success
[INFO] -----> Deploying...
[INFO] remote:
[INFO] remote: -----> Fetching custom tar buildpack... done
[INFO] remote: -----> JVM Common app detected
[INFO] remote: -----> Installing OpenJDK 1.8... done
[INFO] remote: -----> Discovering process types
[INFO] remote: Procfile declares types -> web
[INFO] remote:
[INFO] remote: -----> Compressing... done, 49.5MB
[INFO] remote: -----> Launching... done, v157
[INFO] remote: https://obscure-sierra-7788.herokuapp.com/ deployed to Heroku
[INFO] remote:
[INFO] -----> Done
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:04 min
[INFO] Finished at: 2014-11-11T16:07:11-06:00
[INFO] Final Memory: 20M/304M
[INFO] ------------------------------------------------------------------------
アプリケーションがスタンドアロンの場合 (したがってプロセスタイプが必要な場合)、次のコマンドでデプロイできます。
$ mvn clean heroku:deploy
...
[INFO] -----> Packaging application...
[INFO] - app: obscure-sierra-7788
[INFO] - including: ./target/
[INFO] -----> Creating build...
[INFO] - file: target/heroku/slug.tgz
[INFO] - size: 1MB
[INFO] -----> Uploading build...
[INFO] - success
[INFO] -----> Deploying...
[INFO] remote:
[INFO] remote: -----> Fetching custom tar buildpack... done
[INFO] remote: -----> JVM Common app detected
[INFO] remote: -----> Installing OpenJDK 1.8... done
[INFO] remote: -----> Discovering process types
[INFO] remote: Procfile declares types -> web
[INFO] remote:
[INFO] remote: -----> Compressing... done, 49.5MB
[INFO] remote: -----> Launching... done, v157
[INFO] remote: https://obscure-sierra-7788.herokuapp.com/ deployed to Heroku
[INFO] remote:
[INFO] -----> Done
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:04 min
[INFO] Finished at: 2014-11-11T16:07:11-06:00
[INFO] Final Memory: 20M/304M
[INFO] ------------------------------------------------------------------------
これで、次のコマンドを使用してアプリケーションにアクセスできます。
$ heroku open
または、次のコマンドでログを表示します。
$ heroku logs
Heroku CLI によってユーザーは、アプリケーションへのアクセスが可能になり、git push
でデプロイされたアプリケーションのようにコマンドを実行できるようになります。
高度な設定
Maven プラグインではいくつかの高度な設定を行うことができます。これらすべての設定は、pom.xml
ファイルのプラグインについての <configuration>
要素で定義されます。たとえば、目的の JDK バージョンを次のように設定できます。
<jdkVersion>1.8</jdkVersion>
有効な値と現在のデフォルトバージョンについては、『Heroku の Java サポート』を参照してください。
設定変数を次のように設定できます。
<configVars>
<MY_VAR>SomeValue</MY_VAR>
<JAVA_OPTS>-Xss512k -XX:+UseCompressedOops</JAVA_OPTS>
</configVars>
<configVars>
に定義されるすべての変数は、デフォルトまたは以前定義された環境設定を上書きすることに注意してください。
また、次のように slug に追加のディレクトリを含めることができます (プロジェクトルートを基準とした相対ディレクトリである必要があります)。
<includes>
<include>etc/readme.txt</include>
</includes>
デフォルトでは、プラグインは不可欠のディレクトリをプロジェクトの target
ディレクトリの下にパッケージ化するため、追加のディレクトリを組み込むことは、ほとんどの場合は必要ありません。
WAR ファイルの別の場所を次のように指定できます。
<warFile>relative/path/myapp.war</warFile>
ただし、これは heroku:deploy-war
ゴールを使用してデプロイする場合のみ受け入れられます。
複数のアプリケーションへのデプロイ
ほとんどの実際のアプリケーションは、複数の Heroku アプリ (開発、テスト、本番など) へのデプロイが必要です。通常の場合、これは複数の Git リモートで実行されます。ただし、プラグインを使用すると、システムプロパティ、環境変数、または他のネイティブの Maven/Java 設定方法を使用できます。たとえば、heroku.appName
を次のようにシステムプロパティとして定義することがあります。
$ mvn heroku:deploy -Dheroku.appName=myapp
しかし、推奨されるアプローチでは Maven プロファイルを使用します。設定の例は次のようになります。
<build>
<plugins>
<plugin>
<groupId>com.heroku.sdk</groupId>
<artifactId>heroku-maven-plugin</artifactId>
<configuration>
<processTypes>
<web>java $JAVA_OPTS -cp target/classes:target/dependency/* Main</web>
</processTypes>
</configuration>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>test</id>
<build>
<plugins>
<plugin>
<groupId>com.heroku.sdk</groupId>
<artifactId>heroku-maven-plugin</artifactId>
<configuration>
<appName>myapp-test</appName>
</configuration>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>prod</id>
<build>
<plugins>
<plugin>
<groupId>com.heroku.sdk</groupId>
<artifactId>heroku-maven-plugin</artifactId>
<configuration>
<appName>myapp-prod</appName>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
プラグインおよび Java デプロイの全般についての詳細は、『Heroku の Java サポート』を参照してください。Maven についての詳細は、Apache Maven のドキュメントを参照してください。