Command-Line Arguments in Spring Boot – Spring Boot中的命令行参数

最后修改: 2018年 4月 2日

中文/混合/英文(键盘快捷键:t)

1. Overview

1.概述

In this quick tutorial, we’ll discuss how to pass command-line arguments to a Spring Boot application.

在这个快速教程中,我们将讨论如何向Spring Boot应用程序传递命令行参数。

We can use command-line arguments to configure our application, override application properties or pass custom arguments.

我们可以使用命令行参数来配置我们的应用程序,覆盖应用程序属性或传递自定义参数。

2. Maven Command-Line Arguments

2.Maven命令行参数

First, let’s see how we can pass arguments while running our application using Maven Plugin.

首先,让我们看看如何在使用Maven插件运行我们的应用程序时传递参数。

Later, we’ll see how to access the arguments in our code.

稍后,我们将看到如何在我们的代码中访问这些参数。

2.1. Spring Boot 1.x

2.1.Spring Boot 1.x

For Spring Boot 1.x, we can pass the arguments to our application using -Drun.arguments:

对于Spring Boot 1.x,我们可以使用-Drun.arguments向我们的应用程序传递参数。

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

We can also pass multiple parameters to our app:

我们还可以向我们的应用程序传递多个参数。

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

Note that:

请注意,。

  • Arguments should be comma separated
  • Each argument should be prefixed with —
  • We can also pass configuration properties, like spring.main.banner-mode shown in the example above

2.2. Spring Boot 2.x

2.2.Spring Boot 2.x

For Spring Boot 2.x, we can pass the arguments using -Dspring-boot.run.arguments:

对于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 Command-Line Arguments

3.Gradle命令行参数

Next, let’s discover how to pass arguments while running our application using Gradle Plugin.

接下来,让我们发现如何在使用Gradle插件运行我们的应用程序时传递参数。

We’ll need to configure our bootRun task in build.gradle file:

我们需要在build.gradle文件中配置我们的bootRun任务。

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

Now, we can pass the command-line arguments as follows:

现在,我们可以按以下方式传递命令行参数。

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

4. Overriding System Properties

4.重写系统属性

Other than passing custom arguments, we can also override system properties.

除了传递自定义参数外,我们还可以覆盖系统属性。

For example, here’s our application.properties file:

例如,这里是我们的application.properties文件。

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

To override the server.port value, we need to pass the new value in the following manner (for Spring Boot 1.x):

要覆盖server.port值,我们需要以下列方式传递新值(对于Spring Boot 1.x)。

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

Similarly for Spring Boot 2.x:

对Spring Boot 2.x也是如此。

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

Note that:

请注意,。

  • Spring Boot converts command-line arguments to properties and adds them as environment variables
  • We can use short command-line arguments –port=8085 instead of –server.port=8085 by using a placeholder in our application.properties:
    server.port=${port:8080}
  • Command-line arguments take precedence over application.properties values

If needed, we can stop our application from converting command-line arguments to 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. Accessing Command-Line Arguments

5.访问命令行参数

Let’s see how we can access the command-line arguments from our application’s main() method:

让我们看看如何从我们应用程序的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);
    }
}

This will print the arguments we passed to our application from command-line, but we could also use them later in our application.

这将打印我们从命令行传递给应用程序的参数,但我们也可以在以后的应用程序中使用这些参数。

6. Passing Command-Line Arguments to the SpringBootTest

6.向SpringBootTest传递命令行参数

With the release of Spring Boot 2.2, we gained the possibility to inject command-line arguments during testing using @SpringBootTest and its args attribute:

随着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. Conclusion

7.结论

In this article, we learned how to pass arguments to our Spring Boot application from command-line, and how to do it using both Maven and Gradle.

在这篇文章中,我们学习了如何从命令行向我们的Spring Boot应用程序传递参数,以及如何使用Maven和Gradle进行操作。

We’ve also shown how you can access those arguments from your code, in order to configure your application.

我们还展示了你如何从你的代码中访问这些参数,以便配置你的应用程序。