きり丸の技術日記

技術検証したり、資格等をここに残していきます。

Javaでpropertiesファイルを読み込む

SpringBoot等のフレームワークの機能を使用すると、簡単に設定ファイルが読み込めるようになりました。

しかし、E2Eの試験をするだけのプロジェクト等では重くなりがちなフレームワークを導入したくありません。

今回の記事では、Javaのみでpropertiesファイルを読み込む方法を記載します。なお、調べれば簡単に出る内容ではありますので、新規性はありません。

環境

  • Java
    • 15
  • Gradle

ゴール

Javaで設定ファイルのpropertiesを読み込む。ymlファイルは対象外。

方法

propertiesファイルを用意する

resourcesディレクトリの配下にpropertiesファイルを用意します。今回はcommon.propertiesファイルを用意します。

baseUrl=http://localhost:8080
username=user
password=pass
company=ABCDE00001

設定ファイルを読み込む

Propertiesクラスを使用します。インスタンスを生成し、loadメソッドでファイルを読み込みます。ファイルを読み込んだ後は、getPropertiesメソッドで値を取得することができます。

public class Config {
  private static final Properties properties;

  static {
    properties = new Properties();
    try {
      properties.load(Config.class.getResourceAsStream("common.properties"));
    } catch (Exception e) {
      throw new RuntimeException(
          String.format("ファイルの読み込みに失敗しました。ファイル名:%s", "common.properties"),
          e
      );
    }
  }

  /**
   * プロパティ値を取得する
   */
  public static String getProperty(final String key) {
    return getProperty(key, "");
  }

  /**
   * 取得できなかった時に第二パラメータを返却する
   */
  public static String getProperty(final String key, final String defaultValue) {
    return properties.getProperty(key, defaultValue);
  }
}

個人的にはClassクラスでファイルを取得するとパスの指定が簡単になります。

Fileクラスを使用する場合は文字コードの指定等もできるので、確実に文字コードを指定したい場合はFileクラスを使用しましょう。

properties.load(Files.newBufferedReader(Path.of("src/main/resources", "common.properties"), StandardCharsets.UTF_8));

ファイルを分けている理由

ファイル名を分けている理由は、IntelliJ IDEAのGo to Declaration or Usagesの機能を効かせたいためです。resourcesまでのパスとそれ以降のパスを分けることで、それ以降のパスをクリックすると元のファイルの定義にジャンプすることができます。

Go to Declaration or Usagesの機能を有効的に使えると、テスト時のセットアップファイルやリクエストファイル等にジャンプすることができるので、便利になります。

テストクラス

getPropertyのメソッドを2つ用意したのでテストしましょう。

staticメソッドなので、Configから直接呼べます。また、設定ファイルにキーが無いときは空文字を返却します。

@Test
void test_01() {
  assertThat(Config.getProperty("baseUrl")).isEqualTo("http://localhost:8080");
}

@Test
void test_02() {
  assertThat(Config.getProperty("noKey")).isEqualTo("");
}

第二パラメータを指定した場合、設定ファイルに設定が無いと第二パラメータを返却します。

@Test
void test_03() {
  assertThat(Config.getProperty("noKey", "dummy")).isEqualTo("dummy");
}

ソースコード

ファイル名はこの記事とは異なりますが、実施しているのは同じです。

終わりに

今回は扱いやすさを考慮してstaticにしました。

しかし、SpringではDI対象としてインスタンスを生成するのに慣れているせいで、staticな状態で環境ごとに読み込むファイルを変更する方法が分かりませんでした…。起動時パラメータを元に読み込むファイルを変更したいのですが、どうすればいいんでしょうね。

それがわかったら、また別途記事にしようと思います。

参考