Search code examples
springmavenspring-bootprofiles

about spring boot Profile can not work


when I use command

mvn spring-boot:run -Dspring.profiles.active=web

my project is running,but @Profile("web") bean code not used,that only use properties which the bean write by

 @Profile("default")

how can I change for it,and the properties change to web profile?

@Profile("default")
@Bean
static public PropertySourcesPlaceholderConfigurer defaultPropertySourcesPlaceholderConfigurer() {
    PropertySourcesPlaceholderConfigurer p = new PropertySourcesPlaceholderConfigurer();
    Resource[] resourceLocations = new Resource[] { new ClassPathResource("job.core.properties") };
    p.setLocations(resourceLocations);
    return p;
}

@Profile("web")
@Bean
static public PropertySourcesPlaceholderConfigurer prodWebPropertySourcesPlaceholderConfigurer() {
    PropertySourcesPlaceholderConfigurer p = new PropertySourcesPlaceholderConfigurer();
    Resource[] resourceLocations = new Resource[] {new ClassPathResource("job.core.ris.properties") };
    p.setLocations(resourceLocations);
    return p;
}

job.core.ris.properties

db.driverClass=com.mysql.jdbc.Driver
db.jdbcUrl=jdbc:mysql://192.168.0.68:3306/job_ris?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=UTF-8
db.user=root
db.password=

job.core.properties

db.driverClass=com.mysql.jdbc.Driver
db.jdbcUrl=jdbc:mysql://192.168.0.68:3306/dev?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=UTF-8

when I use action then,show this enter image description here


Solution

  • Work with the framework not against/around it. Spring Boot has build in support to load profile specific application.properties files.

    Instead of trying to shoehorn multiple PropertyPlaceholderConfigurer into a Spring Boot application. Create an application.properties and application-web.properties containing your properties.

    application.properties

    db.driverClass=com.mysql.jdbc.Driver
    db.jdbcUrl=jdbc:mysql://192.168.0.68:3306/dev?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=UTF-8
    

    application-web.properties

    db.jdbcUrl=jdbc:mysql://192.168.0.68:3306/job_ris?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=UTF-8
    db.user=root
    db.password=
    

    (notice the missing db.driverClass you only need to include the different properties).

    Next remove your custom @Bean annotated methods and let Spring Boot do the heavy lifting.

    Pro Tip: Judging from the names of the properties you also have a custom @Bean for your DataSource. Instead of using custom names you probably want to use the spring.datasource.* properties and let Spring Boot create/manage your datasource.