1. 概述

本篇快速教程将介绍如何向 Spring Boot 应用传递命令行参数。

使用命令行参数可以:

  • ✅ 动态配置应用
  • ✅ 覆盖 application.properties 中的属性
  • ✅ 传递自定义参数

2. 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 命令行参数

需先在 build.gradle 中配置 bootRun 任务:

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

然后通过 --args 传递参数:

./gradlew bootRun --args=--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 Boot 2.x:

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

⚠️ 注意:

  • 命令行参数优先级高于 application.properties
  • 可在属性文件中使用占位符简化参数(如 server.port=${port:8080}
  • 需禁用参数转换时(不推荐):
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(Application.class);
        app.setAddCommandLineProperties(false); // 禁用命令行参数转换
        app.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. 在测试中传递命令行参数

Spring Boot 2.2+ 支持通过 @SpringBootTestargs 属性注入测试参数:

@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 中使用命令行参数的关键点:

  1. Maven/Gradle 传递方式

    • Maven: -Drun.arguments (1.x) / -Dspring-boot.run.arguments (2.x)
    • Gradle: 配置 bootRun 任务 + --args 参数
  2. 核心特性

    • 覆盖配置属性(优先级最高)
    • 支持自定义参数
    • 可访问 main() 方法参数
  3. 测试支持

    • 通过 @SpringBootTest(args=...) 注入测试参数

掌握命令行参数能显著提升 Spring Boot 应用的配置灵活性,尤其适合需要动态调整的环境。


原始标题:Command-line Arguments in Spring Boot