Spring Boot: how to use multiple yml files

58,761

Solution 1

@PropertySource does not support YAML (probably it will in Spring 4.1). You can set spring.config.location or spring.config.name to a comma-separated list (e.g. as System property or command line argument).

Personally I like all my YAML in the same place (the structure really helps to break it up visually, and you can use documents inside the file to split it up more). That's just taste I guess.

Solution 2

  1. remove @PropertySource annotation, you not need it
  2. rename your scheduling.yml into src/main/resources/application-scheduling.yml
  3. add in src/main/resources/application.yml file next line:

    spring.profiles.include: 'scheduling'

Solution 3

if I have a lot of configurations and/or environments, usually I do so:

$ cat src/main/resources/application.yml:
spring:
  profiles:
    include: >
      profile1,
      profile2,
      ...
      profileN

$ ls -lah src/main/resources/config:
drwxr-xr-x  4 mak  staff   136B Apr 16 23:58 .
drwxr-xr-x  6 mak  staff   204B Apr 17 01:54 ..
-rw-r--r--  1 mak  staff    60B Apr 16 23:58 application-profile1.yml
-rw-r--r--  1 mak  staff    62B Apr 16 23:16 application-profile2.yml
...
-rw-r--r--  1 mak  staff    50B Apr 16 23:16 application-profileN.yml

Solution 4

You can use active profile concept in your main yaml file. For example:

spring.profiles.active: test

that means you should have application-test.yml file in your resource directory. Consider that active profiles will override properties with the same names in your main yaml file.

For more information visit: http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html

Solution 5

Suppose your application need 4 .yml files.

application.yml
application-dev.yml
application-uat.yml
application-prod.yml

and you have to set different setting for each file.

You just need to set your setting on appropriate environment such as dev, uat ot prod level and the have to add just one property in application.yml file.

  spring:  
    profiles:
       active: dev
    application: /* optional */
       name: Application Name 
Share:
58,761
Johan Frick
Author by

Johan Frick

Technical Lead at Mobenga

Updated on July 09, 2022

Comments

  • Johan Frick
    Johan Frick almost 2 years

    In Spring Boot, I know that I can replace application.properties with application.yml and use the YAML format. However, my application.yml is getting crowded so I need to split it up a bit. How can I do that? I would like to do something like this:

    ...
    @Configuration
    @EnableAutoConfiguration
    @EnableWebMvc
    @EnableScheduling
    @PropertySource({"classpath:application.yml", "classpath:scheduling.yml"})
    public class ApplicationConfig {
    ...
    
  • Johan Frick
    Johan Frick about 10 years
    Thanks, I'll keep it in one file for now then. It would be nicer to split it up though, but I will wait for Spring 4.1.
  • plzdontkillme
    plzdontkillme over 9 years
    For integration testing, if you want to having application.yml file in test/resources and if you want to override only few attributes other than /java/resources how can you do that
  • Dave Syer
    Dave Syer over 9 years
    Use @ActiveProfiles and only put the overrides in the profile you use for testing. Or use @IntegrationTest. Or ReflectionTestUtils.
  • Hazok
    Hazok about 8 years
    It's nice to put everything in the same place until it becomes too large to maintain, in which case breaking things up like the questioner asks is ideal.
  • bluelurker
    bluelurker almost 4 years
    I think the OP wants to have properties grouped by different yaml files. Does your solution solve that issue?
  • M. Justin
    M. Justin over 3 years
    The feature request to add support to YAML files to @PropertySource was never implemented, and has been closed: github.com/spring-projects/spring-framework/issues/18486. The comments by the Spring developers indicate pushback on adding it, since users were wanting to use it in a Spring Boot context where it was not a proper fix.