«1. Обзор

В этом кратком руководстве мы обсудим, как передавать аргументы командной строки в приложение Spring Boot.

Мы можем использовать аргументы командной строки для настройки нашего приложения, переопределения свойств приложения или передачи пользовательских аргументов.

2. Аргументы командной строки Maven

Во-первых, давайте посмотрим, как мы можем передавать аргументы при запуске нашего приложения с помощью подключаемого модуля Maven.

Позже мы увидим, как получить доступ к аргументам в нашем коде.

2.1. Spring Boot 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, нам нужно передать новое значение следующим образом (для Spring Boot 1.x):

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

Аналогично для Spring Boot 2.x:

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

Обратите внимание, что:

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

Spring Boot преобразует аргументы командной строки в свойства и добавляет их в качестве переменных среды Мы можем использовать короткие аргументы командной строки — порт =8085 вместо –server.port=8085, используя заполнитель в наших application.properties: server.port=${port:8080} Аргументы командной строки имеют приоритет над значениями application.properties

    При необходимости мы может помешать нашему приложению преобразовывать аргументы командной строки в свойства:

5. Доступ к аргументам командной строки

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

Давайте посмотрим, как мы можем получить доступ к аргументам командной строки из метода 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:

7. Заключение

@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");
    }
}

В этой статье мы узнали, как передавать аргументы нашему приложению Spring Boot из командной строки и как это делать с помощью Maven и Gradle.

Мы также показали, как вы можете получить доступ к этим аргументам из вашего кода, чтобы настроить ваше приложение.

«