Close

Spring - Accessing application arguments with CommandLinePropertySource

[Last Updated: Dec 22, 2023]

CommandLinePropertySource is PropertySource subclass which is backed by command line arguments passed to a Java Application.

java.lang.ObjectObjectorg.springframework.core.env.PropertySourcePropertySourceorg.springframework.core.env.EnumerablePropertySourceEnumerablePropertySourceorg.springframework.core.env.CommandLinePropertySourceCommandLinePropertySourceorg.springframework.core.env.SimpleCommandLinePropertySourceSimpleCommandLinePropertySourceorg.springframework.core.env.JOptCommandLinePropertySourceJOptCommandLinePropertySourceLogicBig

In this tutorial, we will see the examples of using the two CommandLinePropertySource implementations:

  • SimpleCommandLinePropertySource
  • JOptCommandLinePropertySource

Using SimpleCommandLinePropertySource without Spring context

package com.logicbig.example;

import org.springframework.core.env.SimpleCommandLinePropertySource;

import java.util.Arrays;

public class CmdSourceExample1 {

  public static void main(String[] args) {
      SimpleCommandLinePropertySource ps = new SimpleCommandLinePropertySource(args);
      Arrays.stream(ps.getPropertyNames()).forEach(s ->
              System.out.printf("%s => %s%n", s, ps.getProperty(s)));
  }
}
$ mvn -q compile exec:java -Dexec.mainClass="com.logicbig.example.CmdSourceExample1" -Dexec.args="--myProp=testval1 --myProp2=testVal2"
myProp => testval1
myProp2 => testVal2

We can also use run configuration of an IDE to pass args. In this tutorial we are running our examples with maven.

Using SimpleCommandLinePropertySource with Spring context

package com.logicbig.example;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.core.env.PropertySource;
import org.springframework.core.env.SimpleCommandLinePropertySource;

@Configuration
public class CmdSourceExample2 {

    @Bean
    public MyBean myBean1(){
        return new MyBean();
    }
    public static void main(String[] args) {
        PropertySource theSource = new SimpleCommandLinePropertySource(args);
        AnnotationConfigApplicationContext context =
                new AnnotationConfigApplicationContext(CmdSourceExample2.class);
        context.getEnvironment().getPropertySources().addFirst(theSource);
        MyBean bean = context.getBean(MyBean.class);
        bean.doSomething();
    }

    public class MyBean {
        @Autowired
        private Environment environment;

        public void doSomething() {
            String value = environment.getProperty("myProp");
            System.out.println("the value of myProp: " + value);
        }
    }
}
$ mvn clean -q compile exec:java -Dexec.mainClass="com.logicbig.example.CmdSourceExample2" -Dexec.args="--myProp=testval1 --myProp2=testVal2"
the value of myProp: testval1

Using SimpleCommandLinePropertySource with @Value annotation

package com.logicbig.example;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.PropertySource;
import org.springframework.core.env.SimpleCommandLinePropertySource;

@Configuration
public class CmdSourceExample3 {

    @Bean
    public MyBean myBean() {
        return new MyBean();
    }

    public static void main(String[] args) {
        PropertySource theSource = new SimpleCommandLinePropertySource(args);
        AnnotationConfigApplicationContext context =
                new AnnotationConfigApplicationContext();
        context.getEnvironment().getPropertySources().addFirst(theSource);
        context.register(CmdSourceExample3.class);
        context.refresh();
        MyBean bean = context.getBean(MyBean.class);
        bean.doSomething();
    }

    public class MyBean {
        @Value("${myProp}")
        private String myPropValue;

        public void doSomething() {
            System.out.println("the value of myProp: " + myPropValue);
        }
    }
}
$ mvn -q compile exec:java -Dexec.mainClass="com.logicbig.example.CmdSourceExample3" -Dexec.args="--myProp=testval1 --myProp2=testVal2"
the value of myProp: testval1

Using JOptCommandLinePropertySource

JOptCommandLinePropertySource is backed by OptionSet (part of a third party library, JOpt Simple, which supports various unix style options/arguments). To see what it can do, let's see a simple example without Spring first (we have already included maven dependency of JOpt simple in project browser below):

package com.logicbig.example;

import joptsimple.OptionParser;
import joptsimple.OptionSet;

public class CmdSourceExample4 {

    public static void main(String[] args) {
        OptionParser parser = new OptionParser();
        parser.accepts("myProp").withRequiredArg();
        OptionSet options = parser.parse(args);

        boolean myProp = options.hasArgument("myProp");
        System.out.println(myProp);
        Object myProp1 = options.valueOf("myProp");
        System.out.println(myProp1);
    }
}
$ mvn -q compile exec:java -Dexec.mainClass="com.logicbig.example.CmdSourceExample4" -Dexec.args="-myProp testval1"
true
testval1

Let's use it with JOptCommandLinePropertySource:

@Configuration
public class CmdSourceExample5 {

    @Bean
    public MyBean myBean() {
        return new MyBean();
    }

    public static void main(String[] args) {
        OptionParser parser = new OptionParser();
        parser.accepts("myProp").withRequiredArg();

        OptionSet options = parser.parse(args);
        PropertySource ps = new JOptCommandLinePropertySource(options);

        AnnotationConfigApplicationContext context =
                new AnnotationConfigApplicationContext();
        context.getEnvironment().getPropertySources().addFirst(ps);
        context.register(CmdSourceExample5.class);
        context.refresh();
        MyBean bean = context.getBean(MyBean.class);
        bean.doSomething();
    }

    public class MyBean {
        @Value("${myProp}")
        private String myPropValue;

        public void doSomething() {
            System.out.println("the value of myProp: " + myPropValue);
        }
    }
}
$ mvn -q compile exec:java -Dexec.mainClass="com.logicbig.example.CmdSourceExample5" -Dexec.args="-myProp testval1"
the value of myProp: testval1

Example Project

Dependencies and Technologies Used:

  • spring-context 6.1.2 (Spring Context)
     Version Compatibility: 4.3.0.RELEASE - 6.1.2Version List
    ×

    Version compatibilities of spring-context with this example:

    • 4.3.0.RELEASE
    • 4.3.1.RELEASE
    • 4.3.2.RELEASE
    • 4.3.3.RELEASE
    • 4.3.4.RELEASE
    • 4.3.5.RELEASE
    • 4.3.6.RELEASE
    • 4.3.7.RELEASE
    • 4.3.8.RELEASE
    • 4.3.9.RELEASE
    • 4.3.10.RELEASE
    • 4.3.11.RELEASE
    • 4.3.12.RELEASE
    • 4.3.13.RELEASE
    • 4.3.14.RELEASE
    • 4.3.15.RELEASE
    • 4.3.16.RELEASE
    • 4.3.17.RELEASE
    • 4.3.18.RELEASE
    • 4.3.19.RELEASE
    • 4.3.20.RELEASE
    • 4.3.21.RELEASE
    • 4.3.22.RELEASE
    • 4.3.23.RELEASE
    • 4.3.24.RELEASE
    • 4.3.25.RELEASE
    • 4.3.26.RELEASE
    • 4.3.27.RELEASE
    • 4.3.28.RELEASE
    • 4.3.29.RELEASE
    • 4.3.30.RELEASE
    • 5.0.0.RELEASE
    • 5.0.1.RELEASE
    • 5.0.2.RELEASE
    • 5.0.3.RELEASE
    • 5.0.4.RELEASE
    • 5.0.5.RELEASE
    • 5.0.6.RELEASE
    • 5.0.7.RELEASE
    • 5.0.8.RELEASE
    • 5.0.9.RELEASE
    • 5.0.10.RELEASE
    • 5.0.11.RELEASE
    • 5.0.12.RELEASE
    • 5.0.13.RELEASE
    • 5.0.14.RELEASE
    • 5.0.15.RELEASE
    • 5.0.16.RELEASE
    • 5.0.17.RELEASE
    • 5.0.18.RELEASE
    • 5.0.19.RELEASE
    • 5.0.20.RELEASE
    • 5.1.0.RELEASE
    • 5.1.1.RELEASE
    • 5.1.2.RELEASE
    • 5.1.3.RELEASE
    • 5.1.4.RELEASE
    • 5.1.5.RELEASE
    • 5.1.6.RELEASE
    • 5.1.7.RELEASE
    • 5.1.8.RELEASE
    • 5.1.9.RELEASE
    • 5.1.10.RELEASE
    • 5.1.11.RELEASE
    • 5.1.12.RELEASE
    • 5.1.13.RELEASE
    • 5.1.14.RELEASE
    • 5.1.15.RELEASE
    • 5.1.16.RELEASE
    • 5.1.17.RELEASE
    • 5.1.18.RELEASE
    • 5.1.19.RELEASE
    • 5.1.20.RELEASE
    • 5.2.0.RELEASE
    • 5.2.1.RELEASE
    • 5.2.2.RELEASE
    • 5.2.3.RELEASE
    • 5.2.4.RELEASE
    • 5.2.5.RELEASE
    • 5.2.6.RELEASE
    • 5.2.7.RELEASE
    • 5.2.8.RELEASE
    • 5.2.9.RELEASE
    • 5.2.10.RELEASE
    • 5.2.11.RELEASE
    • 5.2.12.RELEASE
    • 5.2.13.RELEASE
    • 5.2.14.RELEASE
    • 5.2.15.RELEASE
    • 5.2.16.RELEASE
    • 5.2.17.RELEASE
    • 5.2.18.RELEASE
    • 5.2.19.RELEASE
    • 5.2.20.RELEASE
    • 5.2.21.RELEASE
    • 5.2.22.RELEASE
    • 5.2.23.RELEASE
    • 5.2.24.RELEASE
    • 5.2.25.RELEASE
    • 5.3.0
    • 5.3.1
    • 5.3.2
    • 5.3.3
    • 5.3.4
    • 5.3.5
    • 5.3.6
    • 5.3.7
    • 5.3.8
    • 5.3.9
    • 5.3.10
    • 5.3.11
    • 5.3.12
    • 5.3.13
    • 5.3.14
    • 5.3.15
    • 5.3.16
    • 5.3.17
    • 5.3.18
    • 5.3.19
    • 5.3.20
    • 5.3.21
    • 5.3.22
    • 5.3.23
    • 5.3.24
    • 5.3.25
    • 5.3.26
    • 5.3.27
    • 5.3.28
    • 5.3.29
    • 5.3.30
    • 5.3.31
    • Compatible Java Version: 17+
    • 6.0.0
    • 6.0.1
    • 6.0.2
    • 6.0.3
    • 6.0.4
    • 6.0.5
    • 6.0.6
    • 6.0.7
    • 6.0.8
    • 6.0.9
    • 6.0.10
    • 6.0.11
    • 6.0.12
    • 6.0.13
    • 6.0.14
    • 6.0.15
    • 6.1.0
    • 6.1.1
    • 6.1.2

    Versions in green have been tested.

  • jopt-simple 5.0.4 (A Java library for parsing command line options)
  • JDK 17
  • Maven 3.8.1

Spring Accessing application arguments Select All Download
  • command-line-property-source-example
    • src
      • main
        • java
          • com
            • logicbig
              • example
                • CmdSourceExample1.java

    See Also