Javaで環境変数を設定する方法

October 11, 2021
執筆者
レビュー担当者

Javaで環境変数を設定する方法

この記事はMatthew Setterこちらで公開した記事(英語)を日本語化したものです。

環境変数は、データベースやキャッシュサーバー、サードパーティーのAPIなど、コードに明示的に設定を保存することなくJavaアプリケーションを構成するための優れた方法です。

このような設定をコードの外に保管しておくことには、いくつかの利点があります。

  • 設定変更時のコードの更新や再コンパイルが不要になります。
  • ユーザー名やパスワード、デプロイメントトークンなどの機密情報の漏洩を防止します。
  • 同じコードを複数の環境にデプロイできます。

本稿では、Javaで環境変数を扱う方法をご紹介します。

Javaで環境変数にアクセスする方法

最も一般的な方法は、System.getenv()を使う方法です。System.getenv()は任意の引数として、Stringを受け取ります。引数が渡されたかどうかによって、このメソッドから返される値が異なります。

Stringが渡され、内部環境のMapのキーと一致する場合、そのキーに対応する値が返されます。 一致するキーがなければ、nullが返されます。引数が渡されない場合、すべての環境変数とその値を含む読み出し専用のjava.util.Mapが返されます。Mapのキーは環境変数名で、値は環境変数の値です。

UNIX、Linux、macOSでは、環境変数は大文字と小文字を区別しますが、Microsoft Windowsでは、大文字と小文字を区別しません。

以下に、このメソッドを使って、ユーザーのシェルを含むLinuxの環境変数である「SHELL」を取得する例を示します。

package com.settermjd.twilio.envvars;

public class Main {
    public static void main(String[] args) {
        System.out.println(
            String.format("The current shell is: %s.", System.getenv("SHELL"))
        );
    }
}

デフォルト値を設定したい場合は、以下のように System.genenv()を呼び出します。

System.getenv().getOrDefault("SHELL", "/bin/bash")

環境変数の設定方法

環境変数を取得する方法だけでなく、設定方法についても知っておくと役に立ちます。本稿では、詳細までは紹介せず、必要なことだけに絞って説明します。 しかし、環境変数についてもっと深く知りたい方は、Twilio Blogの「環境変数の設定方法」を参照してください。

UNIX、Linux、macOS

UNIX、Linux、macOSでは、環境変数の設定は主に3つの方法で行います。

現在のセッションとすべての子プロセスで利用可能にする

以下の例のように、組み込みのexportコマンドを使用すると、現在のセッションと、現在のセッションで起動したプロセスの両方で利用できるように、環境変数を初期化できます。

export USER_ID=1

この方法で環境変数を設定しても永続的ではありません。環境変数を永久に設定したい場合は、システム全体のスタートアップファイルである /etc/profile か、ユーザー固有のスタートアップファイルである /.bash_profile/.bash_login/.profile で設定する必要があります。

現在のセッションで使用可能にする

以下の例のように、環境変数を初期化して、現在のセッションには利用可能に、子プロセスには無効になるように設定できます。

USER_ID=1

特定のプロセスで利用可能にする

環境変数を初期化し、特定のプロセスでのみ利用可能にできます。これは、特定のプロセスのみが変数を必要とする場合に便利です。以下の例のように、目的の処理を開始するときに初期化します。

USER_ID=1 retrieveUserDetails

Microsoft Windows

Microsoft Windowsでは、環境変数の設定が少し異なります。コントロールパネルから設定するか、コマンドプロンプトまたはPowerShellコンソールで設定するか、どちらかになります。以下に後者2つの例を示します。

# WindowsのコマンドプロンプトでUSER_IDを設定する
set USER_ID=1

# Windows PowerShellのコンソールでUSER_IDを設定する
$Env:USER_ID = 1

.envファイルの使用

このように環境変数を設定することは非常に効果的ですが、一方で課題もあります。たとえば、オペレーティングシステムのシェルで設定する場合、アプリケーションが必要とする変数の具体的なリストはありませんし、変数が何のためにあるのか、どのようなデータ型でなければならないのかといった情報も得られません。

このことから、Twelve-Factor Appは 設定とコードの厳格な分離を推奨しています。この方法論は、.env(dotenv)ファイルの使用を通じて、開発者コミュニティ全体に急速に定着しました。以下の例のような、アプリケーションの動作に必要な環境変数を定義するキーと値のペアのリストを格納するプレーンテキストファイルを使用します。

USER_ID=1
TWILIO_AUTH_TOKEN=1234567890987654321

プロジェクトを手軽に開始するために、すべてのキーを含むが値を含まない .env.example ファイルをプロジェクトに含めるという、さらなる共通の慣習も生まれています。新しい開発者がアプリケーションに取り掛かるとき、そのファイルをコピーし、名前を.envとし、各キーに自分のローカル開発環境に適した値を設定します。

.envファイルの読み込み

上記の例がプロジェクトの.envファイルであったと仮定すると、dotenv-javaのようなパッケージを使用して、変数をアプリケーションで使用できます。

Kotlinで開発している場合は、dotenv-kotlinを使用できます。

このパッケージの使用例は以下のとおりです。

package com.settermjd.twilio.envvars;

import io.github.cdimascio.dotenv.Dotenv;
import io.github.cdimascio.dotenv.DotenvException;

public class Main {
    public static void main(String[] args) {
        Dotenv dotenv = null;
        dotenv = Dotenv.configure().load();
        System.out.println(String.format(
            "Hello World. Shell is: %s. Name is: %s",
            System.getenv("SHELL"),
            dotenv.get("NAME")
        ));
    }
}

このコードでは、新しいDotenvオブジェクトであるdotenvを初期化して、プロジェクトのルートディレクトリにある.envの環境変数を読み込むために、Dotenv.configure().load()を呼び出します。続いて、渡されたStringオブジェクトの値を取得するために、dotenv.get()を使用します。一致するキーが見つからない場合、このメソッドはnullを返します。

必要であれば、メソッドの2つ目の引数としてデフォルト値を設定できます。

.envファイルのセキュリティに関する注意点

もし機密データが.env ファイルに保存されている場合、このファイルをバージョン管理下に置かないでください。バージョン管理下に置いてしまうと、dotenvファイルを使用することによるセキュリティ上の利点がすべて失われてしまいます。このため、バージョン管理から除外するのが一般的です。例えば、Gitを使う場合、プロジェクトの .gitignoreファイルに.envを追加します。

Javaで環境変数を扱う方法をご紹介しました

本稿では、Javaプロジェクトで環境変数を使用する方法をご紹介しました。

他に環境変数を使う方法をご存知でしたら、ぜひお教えください。

Matthew Setterは、Twilio VoicesチームのPHP編集者兼ポリグロットの開発者です。彼はDocker EssentialsMezzio Essentialsの著者でもあります。PHPコードの作成に取り組んでいないときは、TwilioのPHP記事の優秀な編集者です。彼の連絡先はmsetter@twilio.comです。また、TwitterGitHubでも情報を発信しています。