How to override application.properties during production in Spring-Boot?

后端 未结 8 713
隐瞒了意图╮
隐瞒了意图╮ 2020-12-04 13:00

I\'m using spring boot and application.properties to select a database during development by @Configuration @Profile(\"dev\").

spri         


        
相关标签:
8条回答
  • 2020-12-04 13:32

    You can also use @PropertySources

    @PropertySources({
            @PropertySource(value = "classpath:application.properties"),
            @PropertySource(value = "file:/user/home/external.properties", ignoreResourceNotFound = true)
    })
    public class Application {
        public static void main(String[] args) throws Exception {
            ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
    
        }
    
    
    }
    
    0 讨论(0)
  • 2020-12-04 13:34

    I have found the following has worked for me:

    java -jar my-awesome-java-prog.jar --spring.config.location=file:/path-to-config-dir/
    

    with file: added.

    LATE EDIT

    Of course, this command line is never run as it is in production.

    Rather I have

    • [possibly several layers of] shell scripts in source control with place holders for all parts of the command that could change (name of the jar, path to config...)
    • ansible deployment scripts that will deploy the shell scripts and replace the place holders by the actual value.
    0 讨论(0)
  • 2020-12-04 13:35

    UPDATE: this is a bug in spring see here

    the application properties outside of your jar must be in one of the following places, then everything should work.

    21.2 Application property files
    SpringApplication will load properties from application.properties files in the following    locations and add them to the Spring Environment:
    
    A /config subdir of the current directory.
    The current directory
    A classpath /config package
    The classpath root
    

    so e.g. this should work, when you dont want to specify cmd line args and you dont use spring.config.location in your base app.props:

    d:\yourExecutable.jar
    d:\application.properties
    
    or
    
    d:\yourExecutable.jar
    d:\config\application.properties
    

    see spring external config doc

    Update: you may use \@Configuration together with \@PropertySource. according to the doc here you can specify resources anywhere. you should just be careful, when which config is loaded to make sure your production one wins.

    0 讨论(0)
  • 2020-12-04 13:38

    From Spring Boot 2, you will have to use

    --spring.config.additional-location=production.properties
    
    0 讨论(0)
  • 2020-12-04 13:42

    Update with Spring Boot 2.2.2.Release.

    Full example here, https://www.surasint.com/spring-boot-override-property-example/

    Assume that, in your jar file, you have the application.properties which have these two line:

    server.servlet.context-path=/test
    server.port=8081
    

    Then, in production, you want to override the server.port=8888 but you don't want to override the other properties.

    First you create another file, ex override.properties and have online this line:

    server.port=8888
    

    Then you can start the jar like this

    java -jar spring-boot-1.0-SNAPSHOT.jar --spring.config.location=classpath:application.properties,/opt/somewhere/override.properties
    
    0 讨论(0)
  • 2020-12-04 13:43

    I am not sure you can dynamically change profiles.

    Why not just have an internal properties file with the spring.config.location property set to your desired outside location, and the properties file at that location (outside the jar) have the spring.profiles.active property set?

    Better yet, have an internal properties file, specific to dev profile (has spring.profiles.active=dev) and leave it like that, and when you want to deploy in production, specify a new location for your properties file, which has spring.profiles.active=prod:

    java -jar myjar.jar --spring.config.location=D:\wherever\application.properties
    
    0 讨论(0)
提交回复
热议问题