Heroku の Clojure サポート
最終更新日 2024年05月09日(木)
このドキュメントでは、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
タスクを使用するようにします。trampoline では、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 is the default so if you’d like to use Java 8 you don’t need this file at all. You can specify JDK 7 by setting this property to “1.7”. For details on how to set specific update versions, see the Java support article.
サポートされている Clojure バージョン
Heroku では、サポートされている JDK バージョン上で実行されている Clojure のすべての本番環境リリース上のアプリをサポートします。
アドオン
デフォルトでプロビジョニングされるアドオンはありません。アプリ用の SQL データベースが必要な場合は、明示的に追加してください。たとえば、Essential-0 Heroku Postgres データベースを追加するには、次のようにします。
$ heroku addons:create heroku-postgresql:essential-0