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

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

Top comments (0)

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more