Heroku の Clojure サポート
最終更新日 2023年05月15日(月)
このドキュメントでは、Clojure アプリケーションの認識と実行に関連した Heroku の一般的な動作について説明します。アプリケーションのデプロイ方法に関する詳しい説明は、次を参照してください。
アクティベーション
Heroku の Clojure サポートが適用されるのは、アプリケーションのルートディレクトリに project.clj
ファイルがある場合だけです。
Maven を使用する Clojure アプリケーションもデプロイできますが、これらは Java アプリケーションとして扱われるため、別のドキュメント が適用されます。
設定
Leiningen 1.7.1 がデフォルトで使用されますが、project.clj に
:min-lein-version "2.0.0"
がある場合は (強く推奨されます)、Leiningen 2.9.1 リリースが代わりに使用されます。
Procfile
では、アプリを実行させるプロセスタイプを宣言する必要があります。開発環境では通常、Leiningen プロジェクトは lein
run -m my.project.namespace
を使用して起動されますが、こうするとプロジェクトのプロセスに加えて Leiningen が実行されたままになるため、本番環境では推奨されません。また、開発で使用するためのプロファイルが使用されるため、テストライブラリおよびテスト設定が本番環境に入り込むおそれもあります。
一貫性のあるビルドが行われるようにするため、通常ではアプリケーション設定は、コンパイル中に見ることができませんが、プライベートリポジトリ資格情報 (LEIN_USERNAME
など) がある場合は例外となります。公開された内容を変更するには、BUILD_CONFIG_ALLOWLIST
設定を、スペースで区切られた環境設定名のリストに設定します。アプリの設定を変更してもアプリは再構築されないため、この操作が予期しない動作を招く可能性があることに注意してください。
Uberjar
project.clj
に :uberjar-name
設定が含まれている場合、デプロイ中に lein uberjar
が実行されます。これを行う場合、Procfile
エントリは java
呼び出しのみで構成される必要があります。
メインネームスペースに :gen-class
がない場合、clojure.main
をエントリポイントとして使用し、Procfile
内で -m
引数を使用して、アプリのメインネームスペースを指定することができます。
web: java -cp target/myproject-standalone.jar clojure.main -m myproject.web
ビルド中にのみ適用するカスタム設定がある場合、これらの設定を :uberjar
プロファイルに置くことができます。これは本番環境で AOT コンパイルされたクラスを使用する場合に便利なことがありますが、開発中は再ロードの問題を起こすことがあるためそうではありません。
:profiles {:uberjar {:main myproject.web, :aot :all}}
heroku run
セッションで Leiningen が必要な場合、これはオンデマンドでダウンロードされます。
ランタイムに影響する Leiningen の機能 (:jvm-opts
、ネイティブ依存関係の抽出、または :java-agents
など) を使用する場合、Procfile の
java
呼び出しがこれらの機能を含むようにするために、いくらか追加作業を行う必要があります。このような場合、Leiningen を実行時に使用する方が簡単な場合もあります。
ビルドのカスタマイズ
次の環境変数を設定することにより、Leiningen のビルドをカスタマイズできます。
LEIN_BUILD_TASK
: 実行する Leiningen コマンド。LEIN_INCLUDE_IN_SLUG
: yes
に設定すると lein を uberjar slug に追加します。
実行時の Leiningen
直接的な java
呼び出しを Procfile に配置する代わりに、Leiningen にアプリの起動を処理させることができます。これを行う場合は、trampoline
タスクと with-profile
タスクを使用するようにしてください。トランポリンでは、Leiningen はプロジェクトで実行するクラスパスおよびコードを計算し、終了してからプロジェクトの JVM を実行しますが、with-profile
では開発プロファイルが省略されます。
web: lein with-profile production trampoline run -m myapp.web
Leiningen を slug に含めると、サイズが約 10 メガバイト増加し、アプリの起動時間に 1 ~ 2 秒のオーバーヘッドが追加されます。
ビルド動作のオーバライド
これらのいずれのオプションによっても必要な結果が得られない場合、ユーザー独自の実行可能な bin/build
スクリプトをアプリのリポジトリにチェックインすると、Leiningen のセットアップ後にそのスクリプトが compile
または uberjar
の代わりに実行されます。
Leiningen バージョンの設定
buildpack によってリポジトリ内の bin/lein
スクリプトが検査され、存在する場合はデフォルトの lein
コマンドの代わりにそのスクリプトが実行されます。これにより、アプリをビルドするために使用される正しいバージョンの Leiningen を制御できます。
Clojure CLI バージョンの設定
CLOJURE_CLI_VERSION
環境変数を設定することにより、アプリと一緒にインストールされる Clojure CLI のバージョンをカスタマイズできます。デフォルトのバージョンは 1.10.0.411 です。
ランタイム
Heroku では多数の異なるランタイムを使用できます。JDK を設定すると共に、特定の Clojure ランタイムを選択するようアプリを設定できます。
サポートされている JDK バージョン
Heroku は現在、OpenJDK 8 を使用してアプリケーションを実行しています。OpenJDK バージョン 7 も使用できます。選択したメジャーバージョンに応じて、アプリをデプロイするたびに、その Java ランタイムの使用可能な最新のアップデートが使用されます。現在のバージョンの一覧は、Java サポート記事を参照してください。
アプリが使用する JDK は slug に含められ、slug のサイズに影響します。
Java バージョンの指定
system.properties
というファイルをアプリケーションに追加することによって Java バージョンを指定できます。
ファイル内の java.runtime.version
プロパティを設定します。
java.runtime.version=1.8
デフォルトは 1.8 のため、Java 8 を使用する場合、このファイルはまったく必要ありません。JDK 7 を指定するには、このプロパティを “1.7” に設定します。特定のアップデートバージョンを設定する方法についての詳細は、Java support articleを参照してください。
サポートされている Clojure バージョン
Heroku では、サポートされている JDK バージョン上で実行されている Clojure のすべての本番環境リリース上のアプリをサポートします。
アドオン
デフォルトでプロビジョニングされるアドオンはありません。アプリ用の SQL データベースが必要な場合は、明示的に追加してください。たとえば、Mini Heroku Postgres データベースを追加するには、次のようにします。
$ heroku addons:create heroku-postgresql:mini