Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use SpringBoot PropertySource to read from an external configuration file

I've created a configuration class that will store configuration values. These configuration values should be read in from a configuration file "config.properties". Below is the config class:

@Configuration
@ComponentScan(basePackages = {"com.boot.Training.*"})
@PropertySource("file:/src/main/java/config.properties")
public class AppConfig {

    @Value("${myFirstName}")
    private static String myFirstName;

    @Value("${myLastName}")
    private static String myLastName;

    public static void showVariables() {
        System.out.println("firstName: " + myFirstName);
        System.out.println("lastName: " + myLastName);
    }

}

And below are the contents of the config.properties file:

myFirstName=John    
myLastName=Doe

Running my program should simply print the values of these variables. But instead, Eclipse tells me it cannot find the config.properties file, even though I specified that it is located in /src/main/java/config.properties .

I'm likely specifying the file location without taking something else into account. What am I missing here?

like image 903
kramsiv94 Avatar asked Sep 02 '25 15:09

kramsiv94


2 Answers

The location you are using (file:/src/main/java/config.properties) refers to an absolute path rather than one relative to your project home.

A more common way to do this is to ship config.properties as part of your project in a resources directory, and refer to it via the classpath. If you move it to /src/main/resources/config.properties, you can load it this way:

@PropertySource("classpath:config.properties")

I believe in theory you could just leave it in /src/main/java and change your @PropertySource location to what I have above, but moving it to /resources is the more idiomatic way of doing this.

like image 72
Todd Avatar answered Sep 05 '25 07:09

Todd


The basic way to specify a file: location to appoint a properties file that is located elsewhere on your host environment is:

@PropertySource("file:/path/to/application.properties")
  • Note that /path/to/application.properties should be absolute path pointing to your .properties file (in your example you are mixing file: usage and relative path which is not correct )

it is also possible to specify a system property or an environment variable that will be resolved to its actual value when your application starts. For example, ${CONF_DIR} below will be replaced with its associated value when the Spring application starts:

  1. Open /etc/environment in any text editor like nano or gedit and add the following line:

    CONF_DIR=/path/to/directory/with/app/config/files
    
  2. Check it system variable has been set:

    echo $CONF_DIR
    /path/to/directory/with/app/config/files
    
  3. use PropertySource like:

    @PropertySource("file:${CONF_DIR}/application.properties")
    
like image 23
MohammadReza Alagheband Avatar answered Sep 05 '25 06:09

MohammadReza Alagheband