Spring Boot 该应用程序的强大之处在于其灵活运行时的配置能力,命令行参数是实现该能力的关键。本文将深入探讨如何处理它 Spring Boot 在不修改代码的情况下,使用命令行参数覆盖默认设置或添加自定义参数。
一、传递命令行参数
向 Spring Boot 传递命令行参数的方法取决于您的操作模式:
- 可执行 JAR 包: 运行包装后 JAR 直接在文件中 JAR 添加文件名后的参数:
java -jar myapp.jar --server.port=8081 --custom.argument=value
- Maven 插件: 使用 Spring Boot Maven 使用插件时 -Dspring-boot.run.arguments 属性传递参数:
mvn spring-boot:run -Dspring-boot.run.arguments="--server.port=8081,--custom.argument=value"
- Gradle 插件: 在 build.gradle 文件中配置 bootRun 任务,然后操作:
./gradlew bootRun --args="--server.port=8081,--custom.argument=value"
二、在应用代码中访问命令行参数
Spring Boot 访问命令行参数提供两个接口:
- CommandLineRunner 接口: 这个接口允许你在那里 Spring 加载容器后执行代码,访问命令行参数:
@SpringBootApplication public class MyApp implements CommandLineRunner { public static void main(String[] args) { SpringApplication.run(MyApp.class, args); } @Override public void run(String... args) throws Exception { for (String arg : args) { System.out.println(arg); } } }
- ApplicationRunner 接口: 与 CommandLineRunner 类似,但提供 ApplicationArguments 接口,用于更结构化的参数访问:
@SpringBootApplication public class MyApp implements ApplicationRunner { public static void main(String[] args) { SpringApplication.run(MyApp.class, args); } @Override public void run(ApplicationArguments args) throws Exception { if (args.containsOption("custom.argument")) { System.out.println("Custom argument: " + args.getOptionValues("custom.argument")); } } }
这两种方法都可以处理选项参数(例如) --custom.argument=value)和非选项参数。
三、覆盖应用属性
可以覆盖命令行参数 application.properties 或 application.yml 文件中定义的属性。例如,修改服务器端口:
- 命令行: java -jar myapp.jar --server.port=8081
- Maven: mvn spring-boot:run -Dspring-boot.run.arguments="--server.port=8081"
命令行的参数优先级最高,以确保其覆盖其他配置。
四、禁止命令行属性转换
Spring Boot 默认情况下,将命令行参数转换为属性并添加 Spring 在环境中。如有必要禁止此行为,可在主类中设置:
@SpringBootApplication public class MyApp { public static void main(String[] args) { SpringApplication app = new SpringApplication(MyApp.class); app.setAddCommandLineProperties(false); app.run(args); } }
这样可以防止在环境中添加命令行参数。
(参考:Baeldung, Spring Boot 官方文档)
以上是弹簧 - :命令行 - arguments-有关overview的详细信息,请关注图灵教育的其他相关文章!
