SpringBootで複数のapplication.ymlの読み込んで、環境ごとの起動をラクにする

エキサイト株式会社エンジニアの佐々木です。SpringBootではapplication.ymlなどの設定情報を読み込む方法がいくつかあるのでまとめます。

前提

$ java --version
openjdk 17.0.10 2024-01-16 LTS
OpenJDK Runtime Environment Corretto-17.0.10.7.1 (build 17.0.10+7-LTS)
OpenJDK 64-Bit Server VM Corretto-17.0.10.7.1 (build 17.0.10+7-LTS, mixed mode, sharing)

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v3.2.3)

設定ファイル一覧

設定

下記の3ファイルになります。

- application.yml
- application-a.yml
- application-b.yml
- application-c.yml

コード

リクエストされたら、application.ymlで設定されてデータが返却されます。

@RestController
@RequestMapping("yml")
@RequiredArgsConstructor
@Slf4j
public class ApplicationYmlController {

    @Value("${jp.co.excite.name}")
    private String value;

    @GetMapping("")
    public String applicationYml() {
        return value;
    }

}

起動引数で設定される値を変える

  • 引数なし
java -jar yml-test.jar

curl http://localhost:8080/yml
default

引数がない場合は、application.ymlが使用されます。

  • 引数 --spring.profiles.active=a
java -jar yml-test.jar --spring.profiles.active=a

curl http://localhost:8080/yml
a

引数がある場合は、デフォルトのプロファイルと指定されたプロファイルが使用されます。 この場合は、application.ymlapplication-a.ymlが読み込まれます。

  • 引数 --spring.profiles.active=b
java -jar yml-test.jar --spring.profiles.active=b

curl http://localhost:8080/yml
b

別のプロファイルを指定してもちゃんと読み込まれています。

  • 引数 --spring.profiles.active=a,b
java -jar yml-test.jar --spring.profiles.active=a,b

curl http://localhost:8080/yml
b

java -jar yml-test.jar --spring.profiles.active=b,a

curl http://localhost:8080/yml
a

複数指定する場合は、後勝ちになります。指定された順番で上書きしていくイメージです。

補足./gradlew bootRun の場合

gradle

 ./gradlew bootRun --args='--spring.profiles.active=a'

設定ファイルの中で指定する場合

設定ファイルの中でも、他の設定ファイルを読み込むことが可能です。spring.config.importを使用します。

spring:
  config:
     import: classpath:${プロファイルのファイル}

上記で指定できます。こちらも後勝ちなので、設定には注意が必要です。

まとめ

SpringBootでは、環境によって設定ファイルをリネーム、設定の書き換えなどの操作は、基本的に行わずに起動引数によって解決するようになっています。これはとても便利なので、多用していきたいところです。

さいごに

エキサイトではフロントエンジニア、バックエンドエンジニア、アプリエンジニアを随時募集しております。長期インターンも歓迎していますので、興味があれば連絡いただければと思います。

募集職種一覧はこちらになります!(カジュアル面談もぜひ!) www.wantedly.com