Intellijから実行/テストするときもHOCONへ任意の環境変数を渡したい


シチュエーション

application.conf
detabesu.username = john.doe
detabesu.password = ${PASSWORD}

以下の理由などにより一部の設定値を環境変数からHOCONを通じてプログラムへ渡している。

  • 実行環境毎に異なる値を使いたい
  • パスワードを設定ファイルに書き込みたくない

問題

sbt経由やパッケージング後に設定値を渡す場合は問題ないが、Intellijから直接実行したりテストを実行する場合はどうすればよいかわからない。

解決法

Intellijの実行設定(Run/Debug Configurations)から環境変数を渡す(推奨)

上のように環境変数用の入力フォームが用意されている場合はそこへ入力すれば良い。

sbtから実行する場合などは環境変数用のフォームが用意されていない。このような場合はVM parametersを使う。

lightbend/config: configuration library for JVM languages using HOCON files

users can override the config with Java system properties, java -Dmyapp.foo.bar=10

のように書かれている通りJavaのシステムプロパティを使うことでHOCONへ任意の値を渡すことができる1ので、

画像のように -D環境変数名=値 のフォーマットで記述する。

Intellijそのものへ環境変数を渡す(非推奨)

あまり推奨できない。というのはここで設定した環境変数は開いているプロジェクトなどに関わらず一律設定されてしまうため、異なるプロジェクトで同じ環境変数名を使って異なる値を設定したい場合などに混乱が起きやすいため。

Linuxの場合

Intellijの起動コマンド前に環境変数を渡してやればよい。

PASSWORD=abc idea&

ubuntuのlauncherなどに登録している場合、まず.desktopの場所を特定する。

locate intellij-idea-community_intellij-idea-community.desktop

その後.desktopファイルのExec部分を書き換え、任意の環境変数を渡す

intellij-idea-community_intellij-idea-community.desktop
[Desktop Entry]
Type=Application
Name=IntelliJ IDEA Community Edition
Exec=env PASSWORD=abc /snap/bin/intellij-idea-community %f
Terminal=false
StartupWMClass=jetbrains-idea-ce

MACの場合

Linuxと同様だが、.desktopファイルに当たるものはなく、それに当たるlaunchctlを使った設定方法はかなり手間がかかる。

Windowsの場合

TBW


  1. 厳密には環境変数とシステムプロパティは違うものであるが、今回は話を単純にするためあえて混同して書いている