JDK のカスタマイズ
最終更新日 2024年05月03日(金)
ランタイム JVM で機能を公開するために、JDK にファイルをバンドルすることが必要な場合があります。たとえば、カスタム証明機関 (CA) ストアの追加は一般的です。このようなケースを処理するために、Heroku では、.jdk-overlay
フォルダー内のアプリによって指定されたファイルが JDK のディレクトリ構造にコピーされます。
JVM に追加のファイルを含めるには、次の手順に従います。
前提条件
JDK バージョンの指定
system.properties
ファイルがまだ存在しない場合は作成し、バージョンを指定して、それを Git にコミットします。サポートされているバージョンは、Java サポートの記事で説明されています。このファイルの内容は次のようになります。
java.runtime.version=11
その後、次を実行して、このファイルを Git に追加します。
$ git add system.properties
$ git commit -m "JDK 11"
.jdk-overlay
フォルダーの作成
アプリケーションのルートディレクトリで、.jdk-overlay
フォルダーを作成します。
$ mkdir .jdk-overlay
$ ls -la
total 24
drwxr-xr-x 9 user staff 306 Oct 16 14:43 .
drwxr-xr-x 202 user staff 6868 Oct 16 14:40 ..
drwxr-xr-x 13 user staff 442 Oct 16 15:06 .git
drwxr-xr-x 3 user staff 102 Oct 16 14:43 .jdk-overlay
-rw-r--r-- 1 user staff 45 Oct 16 14:40 Procfile
-rw-r--r-- 1 user staff 1860 Oct 16 14:40 pom.xml
drwxr-xr-x 3 user staff 102 Oct 16 14:40 src
-rw-r--r-- 1 user staff 25 Oct 16 14:40 system.properties
カスタムファイルの追加
すべてのカスタムファイルを .jdk-overlay
ディレクトリにコピーします。これらのファイルは、JDK 内の対応するディレクトリにコピーされます。たとえば、カスタムセキュリティポリシーを定義するには、アプリのリポジトリの .jdk-overlay/jre/lib/security/
(Java 9 以上の場合は .jdk-overlay/lib/security
) ディレクトリに java.policy
ファイルを追加できます。
カスタム証明書の追加
JDK の cacerts
にカスタム証明書を追加することが必要になる場合もあります。ローカル JDK 内のキーストアから始めるか、またはベース Heroku キーストアをダウンロードできます。次を使用してカスタム証明書を追加します。
$ keytool -import -keystore cacerts -file custom.cer
パスワードの入力が求められる場合があります。デフォルトのパスワードは changeit
です。その後、キーストアをアプリのリポジトリの .jdk-overlay/jre/lib/security/
ディレクトリ (Java 9 以上の場合は .jdk-overlay/lib/security/
) に配置して slug に追加できます。
ここで、次のように、すべてのカスタムファイルを Git リポジトリに追加します。
$ git add .jdk-overlay
$ git commit -m "Custom JDK Files"
次に、アプリケーションをカスタムファイルと共に Heroku にデプロイします。
$ git push heroku master
これにより、JDK のキーストアがオーバーライドされます。Stack が更新されると、アプリケーションではキーストアの自動更新を利用できなくなります。
コピーの確認
Heroku で bash セッションを起動し、JDK ディレクトリをチェックすることによってコピーを確認できます。JDK ディレクトリは $HOME/.jdk/
にあります。
たとえば、カスタム証明書が正しくコピーされたことを確認するには、$HOME/.jdk/jre/lib/security/
ディレクトリをチェックできます。
$ heroku run bash
Running `bash` attached to terminal... up, run.1
~ $ keytool -list -keystore .jdk/jre/lib/security/cacerts
...
Your keystore contains 140 entries
...
その他の例
この方法は、必要に応じて Java 拡張機能に使用できます。ただし、依存関係を導入するために推奨されるメカニズムは依存関係管理ツール (Maven など) です。