DEV Community

Hunor Vadasz-Perhat
Hunor Vadasz-Perhat

Posted on

spring-019: command-line-arguments-overview

In Spring Boot, command-line arguments offer a flexible way to configure applications at runtime, allowing you to override default settings or pass custom parameters without altering the codebase. Here's a structured overview:


1. Passing Command-Line Arguments

You can supply command-line arguments to a Spring Boot application in various ways, depending on how you run the application:

  • Executable JAR: When running the packaged JAR file, append arguments after the JAR name:
 java -jar myapp.jar --server.port=8081 --custom.argument=value 
Enter fullscreen mode Exit fullscreen mode
  • Maven Plugin: If using the Spring Boot Maven plugin, pass arguments using the -Dspring-boot.run.arguments property:
 mvn spring-boot:run -Dspring-boot.run.arguments="--server.port=8081,--custom.argument=value" 
Enter fullscreen mode Exit fullscreen mode
  • Gradle Plugin: Configure the bootRun task in your build.gradle to accept arguments:
 bootRun { if (project.hasProperty('args')) { args project.args.split(',') } } 
Enter fullscreen mode Exit fullscreen mode

Then run:

 ./gradlew bootRun --args="--server.port=8081,--custom.argument=value" 
Enter fullscreen mode Exit fullscreen mode

These methods allow you to override default configurations or provide custom parameters at runtime. (baeldung.com)


2. Accessing Command-Line Arguments in Application Code

Spring Boot provides interfaces to access command-line arguments within your application:

  • Implementing CommandLineRunner: This interface allows you to execute code with access to the command-line arguments after the application context is loaded:
 @SpringBootApplication public class MyApp implements CommandLineRunner { public static void main(String[] args) { SpringApplication.run(MyApp.class, args); } @Override public void run(String... args) { for (String arg : args) { System.out.println(arg); } } } 
Enter fullscreen mode Exit fullscreen mode
  • Implementing ApplicationRunner: Similar to CommandLineRunner but provides the ApplicationArguments interface for more structured access:
 @SpringBootApplication public class MyApp implements ApplicationRunner { public static void main(String[] args) { SpringApplication.run(MyApp.class, args); } @Override public void run(ApplicationArguments args) { if (args.containsOption("custom.argument")) { System.out.println("Custom Argument: " + args.getOptionValues("custom.argument")); } } } 
Enter fullscreen mode Exit fullscreen mode

These approaches enable you to handle both option arguments (e.g., --custom.argument=value) and non-option arguments. (baeldung.com)


3. Overriding Application Properties

Command-line arguments can override properties defined in application.properties or application.yml. For instance, to change the server port:

  • Command-Line:
 java -jar myapp.jar --server.port=8081 
Enter fullscreen mode Exit fullscreen mode
  • Maven:
 mvn spring-boot:run -Dspring-boot.run.arguments="--server.port=8081" 
Enter fullscreen mode Exit fullscreen mode

In the application's property hierarchy, command-line arguments have the highest precedence, ensuring they override other configurations. (docs.spring.io)


4. Disabling Command-Line Property Conversion

By default, Spring Boot converts command-line arguments to properties and adds them to the Spring Environment. To disable this behavior:

@SpringBootApplication public class MyApp { public static void main(String[] args) { SpringApplication app = new SpringApplication(MyApp.class); app.setAddCommandLineProperties(false); app.run(args); } } 
Enter fullscreen mode Exit fullscreen mode

This prevents command-line arguments from being added to the Environment, which can be useful in certain scenarios. (docs.spring.io)


For a visual demonstration, you might find this video helpful:

Pass and Read Command-line Arguments in Spring Boot

Top comments (0)