Heroku の Java サポート
この記事の英語版に更新があります。ご覧の翻訳には含まれていない変更点があるかもしれません。
最終更新日 2024年05月09日(木)
Table of Contents
Heroku は Java のさまざまな実装で Java アプリケーションを実行でき、フレームワーク固有のワークフローのためのサポートを備えています。
このドキュメントでは、Java アプリケーションの認識と実行に関連した Heroku の一般的な動作について説明します。Heroku での一般的な Java サポートとは、Play を除くすべてのフレームワークに対するサポートのことを言います。Play フレームワークのサポートについては、Play フレームワークサポートリファレンスを参照してださい。
フレームワーク固有のチュートリアルについては、次を参照してください。
アクティベーション
Heroku での Java アプリケーション用のデフォルトのビルドシステムは Maven です。pom.xml
を含むアプリケーションには、Maven 用の Heroku Java サポートが適用されます。
デプロイされたアプリケーションが Java アプリケーションとして認識された場合、Heroku は Java app detected
と応答します。
$ git push heroku master
-----> Java app detected
ビルド動作
アプリをビルドするには以下のコマンドを実行します。
$ mvn -B -DskipTests clean dependency:list install
ただし、Heroku はアプリケーションのリポジトリ内に mvnw
スクリプトを検出した場合、デフォルトの Maven インストールの代わりにこのスクリプトを実行します。この動作は Maven バージョンを明示的に設定することによってオーバーライドできます。
パフォーマンスを向上させるため、Mavenリポジトリはビルド間でキャッシュされます。
環境
dyno にはブート時に次の環境変数が設定されます。
PORT
: Web プロセスはこの HTTP ポートにバインドされますJAVA_HOME
: JDK インストールディレクトリの場所LD_LIBRARY_PATH
: JDK 共有ライブラリの場所JDBC_DATABASE_URL
: DATABASE_URL
変数が存在する場合、この変数は変換された形式で入力されます。詳細は、「Java を使用して Heroku でリレーショナルデータベースに接続する」を参照してください。JAVA_TOOL_OPTIONS
: dyno サイズに基づくデフォルトの Java オプションJAVA_OPTS
: dyno サイズに基づくデフォルトの Java オプション (JAVA_TOOL_OPTIONS
と同様)
JAVA_TOOL_OPTIONS について
JAVA_TOOL_OPTIONS
は Java によって直接サポートされ、コマンドラインにアクセスできないかコマンドラインを変更できない環境でコマンドラインを拡張するためのものです。Heroku ではこの値を dyno サイズに基づくデフォルトの Java オプションを設定するために使用します。Java ではこれが自動的に選択されるため、これを Procfile
コマンドに含める必要はありません。
これらの設定を Procfile
コマンドでオーバーライドすることができ、デフォルトよりも優先されます。たとえば、-Xmx300m
のデフォルトを変更する場合は、次を渡すことができます。
web: java -Xms150M -jar target/myapp.jar
独自の JAVA_TOOL_OPTIONS
環境変数を設定することもできます。独自の変数を設定すると、その値は Heroku のデフォルトに追加されて、優先されます。Procfile
コマンドやカスタムの JAVA_TOOL_OPTIONS
でオーバーライドされない個別のオプションは、引き続き有効になります。
Java プロセスが dyno で開始されると、次の Java オプションが JAVA_TOOL_OPTIONS
に追加され、Java によって自動的に選択されます。
-
-Dfile.encoding=UTF-8
-XX:+UseContainerSupport
(Java 11 以上の場合)
dyno サイズのための環境の調整
新しい dyno タイプが選択されると、以下の設定が自動的に JAVA_TOOL_OPTIONS
に追加されます。
eco
、basic
、またはstandard-1x
: -Xmx300m -Xss512k -XX:CICompilerCount=2
standard-2x
: -Xmx671m -XX:CICompilerCount=2
performance-m
: -Xmx2g
performance-l
: -Xmx12g
performance-l-ram
、performance-xl
、performance-2xl
: -XX:MaxRAMPercentage=80.0
Private Space dyno および Shield Private Space dyno の場合、値は以下のようになります。
private-s
またはshield-s
: -Xmx671m -XX:CICompilerCount=2
private-m
またはshield-m
: -Xmx2g
private-l
またはshield-l
: -Xmx12g
private-l-ram
、private-xl
、private-2xl
、shield-l-ram
、shield-xl
、shield-2xl
: -XX:MaxRAMPercentage=80.0
リソース使用量の監視
追加の JVM フラグを使用して、dyno のリソース使用量を監視できます。リソース使用量を監視するには、次のフラグをお勧めします。
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution -XX:+UseConcMarkSweepGC
JVM プロセスの調整について詳しくは、トラブルシューティングの記事を参照してください。
サポートされている Java バージョン
Heroku は現在、デフォルトで OpenJDK 8 を使用してアプリケーションを実行しています。他の OpenJDK バージョンも利用できます。選択した OpenJDK バージョンに応じて、アプリをデプロイするたびに、その JDK の使用可能な最新のバージョンが使用されます。
各 OpenJDK バージョンと Heroku スタックに対する現在のデフォルトバージョンは、次のとおりです。
OpenJDK バージョン | heroku-20 |
heroku-22 |
---|---|---|
OpenJDK 7 | 1.7.0_352 | 1.7.0_352 |
OpenJDK 8 | 1.8.0_412 | 1.8.0_412 |
OpenJDK 11 | 11.0.23 | 11.0.23 |
OpenJDK 13 | 13.0.14 | 13.0.14 |
OpenJDK 14 | 14.0.2 | - |
OpenJDK 15 | 15.0.10 | 15.0.10 |
OpenJDK 16 | 16.0.2 | - |
OpenJDK 17 | 17.0.11 | 17.0.11 |
OpenJDK 18 | 18.0.2.1 | 18.0.2.1 |
OpenJDK 19 | 19.0.2 | 19.0.2 |
OpenJDK 20 | 20.0.2 | 20.0.2 |
OpenJDK 21 | 21.0.3 | 21.0.3 |
OpenJDK 22 | 22.0.1 | 22.0.1 |
赤色のテキストと背景でマークアップされている行は、サポートが完全に終了し、上流の保守担当からいかなる種類のアップデートも受け取っておらず、Heroku によるサポートが終了している OpenJDK バージョンを示しています。
アプリが使用する OpenJDK は slug に含められるので、slug のサイズに影響します。
Java バージョンの指定
system.properties
というファイルをアプリケーションに追加することによって Java バージョンを指定できます。
ファイル内の java.runtime.version
プロパティを設定します。
java.runtime.version=11
Refer to the supported Java versions table for accepted major version values. Because the default is 8, you don’t need this file to use Java 8.
次のような値を使用することによって、JDK アップデートバージョンを固定することもできます。
java.runtime.version=1.8.0_202
ただし、より一般的な 1.8
形式を使用することをお勧めします。こうすることで、あらゆるセキュリティ更新が自動的にインストールされます。
OpenJDK ディストリビューションの指定
Heroku では、Azul® Zulu® または Heroku のいずれかからの OpenJDK のビルドがサポートされています。どちらのディストリビューションも同じソースから構築されており、Java SE 仕様に完全に準拠しています。OpenJDK の Azul® Zulu® ビルドはさらに TCK/JCK 認証を受けており、推奨される OpenJDK ディストリビューションです。
各スタックでの現在の OpenJDK のデフォルトディストリビューションは、次のとおりです。
heroku-18 |
heroku-20 |
heroku-22 |
---|---|---|
Heroku | Heroku | Azul® Zulu® |
デフォルト以外のディストリビューションの使用
アプリでデフォルト以外のディストリビューションを使用するには、Java バージョンを指定する必要があります。バージョン文字列に heroku-
または zulu-
の接頭辞を付けて、それぞれのディストリビューションを選択します。
OpenJDK 11 を使用し、Azul® Zulu® を OpenJDK ディストリビューションとして明示的に選択するには、以下を system.properties
に追加します。
java.runtime.version=zulu-11
Java バージョンのアップグレード
すべての Java アプリは、デプロイされたときに限り、利用可能な最新の JDK バージョンに自動的にアップグレードされます。アプリが再デプロイされない場合、または system.properties
ファイルに特定のバージョンが構成されていた場合、これらはアップグレードされません。
Maven バージョンの指定
Heroku では、Maven バージョンを定義するために推奨されるメカニズムである Maven Wrapper がサポートされています。Heroku はリポジトリのルートディレクトリに mvnw
ファイルを検出した場合、このスクリプトを使用して Maven プロセスを起動します。
また、次のように maven.version
プロパティを設定することによって、system.properties
ファイルで Maven バージョンを指定できます。
maven.version=3.9.4
If this property is defined, the mvnw
script is ignored. You are not upgraded to a newer version automatically and need to update your system.properties
file to get a newer version.
バージョンを指定せず Maven Wrapper を使用しない場合のデフォルトは 3.9.4 です。このデフォルトはいずれ変更されるため、安定したビルドを保証するために Maven Wrapper を使用することをお勧めします。
デフォルトの Web プロセスタイプ
Java buildpack は Spring Boot および Thorntail の Web フレームワークの使用を自動的に検出します。Spring Boot の場合、次のコマンドで web
プロセスタイプを作成します。
java -Dserver.port=$PORT $JAVA_OPTS -jar target/*.jar
Thorntail の場合、buildpack はデフォルトの web
プロセスタイプに対して次のコマンドを使用します。
java -Dswarm.http.port=$PORT $JAVA_OPTS -jar target/*.jar
Procfile
を使用して、これらのデフォルトをオーバーライドしたり、カスタムプロセスタイプを定義したりできます。適切なコマンドは、ご使用のアプリおよびフレームワークによって異なります。Procfile
の設定については、いずれかの Java チュートリアルを参照してください。
Postgres の自動プロビジョニング
このセクションは、2023 年 5 月 15 日より前に作成されたアカウントまたは Heroku サポートにアカウントの自動プロビジョニングを有効にするように依頼した場合にのみ該当します。
Heroku Postgres データベースは、Java アプリケーションの初回デプロイで自動的にプロビジョニングされます。これらのアプリは、pom.xml
で、Postgres JDBC ドライバーまたはpgjdbc-ng ドライバーへの依存関係が必要です。この自動プロビジョニングにより DATABASE_URL
環境変数が入力されます。
Postgres アドオンが必要ない場合、次のコマンドを実行してアドオンを削除します。
$ heroku addons:destroy DATABASE --app example-app