1. 概要

このクイックチュートリアルでは、コマンドライン引数をSpring Bootアプリケーションに渡す方法について説明します。

コマンドライン引数を使用して、アプリケーションを構成したり、アプリケーションプロパティをオーバーライドしたり、カスタム引数を渡したりできます。

2. Mavenコマンドライン引数

まず、Mavenプラグインを使用してアプリケーションを実行しているときに引数を渡す方法を見てみましょう。

後で、コード内の引数にアクセスする方法を説明します。

2.1. スプリングブート1.x

Spring Boot 1.xの場合、-Drun.argumentsを使用してアプリケーションに引数を渡すことができます。

mvn spring-boot:run -Drun.arguments=--customArgument=custom

複数のパラメーターをアプリに渡すこともできます。

mvn spring-boot:run -Drun.arguments=--spring.main.banner-mode=off,--customArgument=custom

ご了承ください:

  • 引数はコンマで区切る必要があります
  • 各引数の前には—を付ける必要があります
  • 上記の例に示すspring.main.banner-modeのような構成プロパティを渡すこともできます

2.2. Spring Boot 2.x

Spring Boot 2.xの場合、 -Dspring-boot.run.arguments:を使用して引数を渡すことができます。

mvn spring-boot:run -Dspring-boot.run.arguments=--spring.main.banner-mode=off,--customArgument=custom

3. Gradleコマンドライン引数

次に、Gradleプラグインを使用してアプリケーションを実行しているときに引数を渡す方法を見つけましょう。

bootRunタスクをbuild.gradleファイルで構成する必要があります。

bootRun {
    if (project.hasProperty('args')) {
        args project.args.split(',')
    }
}

これで、次のようにコマンドライン引数を渡すことができます。

./gradlew bootRun -Pargs=--spring.main.banner-mode=off,--customArgument=custom

4. システムプロパティのオーバーライド

カスタム引数を渡す以外に、システムプロパティをオーバーライドすることもできます。

たとえば、application.propertiesファイルは次のとおりです。

server.port=8081
spring.application.name=SampleApp

server.port 値をオーバーライドするには、次の方法で新しい値を渡す必要があります(Spring Boot 1.xの場合)。

mvn spring-boot:run -Drun.arguments=--server.port=8085

Spring Boot2.xの場合も同様です。

mvn spring-boot:run -Dspring-boot.run.arguments=--server.port=8085

ご了承ください:

  • Spring Bootは、コマンドライン引数をプロパティに変換し、それらを環境変数として追加します
  • application.properties でプレースホルダーを使用することにより、 –server.port = 8085の代わりに短いコマンドライン引数–port =8085を使用できます。
    server.port=${port:8080}
  • コマンドライン引数は、application.properties値よりも優先されます

必要に応じて、アプリケーションがコマンドライン引数をプロパティに変換しないようにすることができます。

@SpringBootApplication
public class Application extends SpringBootServletInitializer {
    public static void main(String[] args) {
        SpringApplication application = new SpringApplication(Application.class);
        application.setAddCommandLineProperties(false);
        application.run(args);
    }
}

5. コマンドライン引数へのアクセス

アプリケーションのmain()メソッドからコマンドライン引数にアクセスする方法を見てみましょう。

@SpringBootApplication
public class Application extends SpringBootServletInitializer {
    public static void main(String[] args) {
        for(String arg:args) {
            System.out.println(arg);
        }
        SpringApplication.run(Application.class, args);
    }
}

これにより、コマンドラインからアプリケーションに渡した引数が出力されますが、後でアプリケーションで使用することもできます。

6. コマンドライン引数をSpringBootTestに渡す

Spring Boot 2.2のリリースにより、@SpringBootTestとそのargs属性を使用して、テスト中にコマンドライン引数を挿入できるようになりました。

@SpringBootTest(args = "--spring.main.banner-mode=off")
public class ApplicationTest {

    @Test
    public void whenUsingSpringBootTestArgs_thenCommandLineArgSet(@Autowired Environment env) {
        Assertions.assertThat(env.getProperty("spring.main.banner-mode")).isEqualTo("off");
    }
}

7. 結論

この記事では、コマンドラインからSpring Bootアプリケーションに引数を渡す方法と、MavenとGradleの両方を使用して引数を渡す方法を学びました。

また、アプリケーションを構成するために、コードからこれらの引数にアクセスする方法も示しました。