Spring Boot version: 2.4
After upgrading to Spring Boot 2.4 from Spring Boot 2.3 I noticed that the ordering has changed of how SpringApplication.additionalProfiles are merged with the ConfigurableEnvironment.getActiveProfiles().
With Spring Boot 2.3 the ordering is: additional profiles, active profiles
With Spring Boot 2.4 the ordering is: active profiles, additional profiles
When running the test application below with Spring Boot 2.3 and Spring Boot 2.4 you can see this easily in the logging:
Spring Boot 2.3.10.RELEASE profiles ordering: additional, active
Spring Boot 2.4.5 profiles ordering: active, additional
This ordering change also affects the @ActiveProfiles test annotation. The profiles activated via the annotation now also have a lesser priority then the additional profiles (if you are wondering how we are setting additional profiles in combination with running tests, this is because we are actually using a ApplicationStartingEvent ApplicationListener, registered via the spring.factories to call the SpringApplication.setAdditionalProfiles() with an environment specific profile).
This change has the effect that our application-{profile}.yml property sources are now getting different precedence, which caused issues for us when running tests, because property values where not being overridden in the expected order anymore.
I wonder if this change in ordering was an intentional one or that it is a mistake. I couldn't find any remarks regarding the change in the changelog. I have also read the https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-Config-Data-Migration-Guide but I couldn't distill this information from that document as well. If the ordering change is intentional then I recommend adding a note in the migration guide.
Test code:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.core.env.AbstractEnvironment;
import org.springframework.core.env.Environment;
@SpringBootApplication
public class AdditionalProfilesReproductionApplication implements CommandLineRunner {
public static void main(String[] args) {
System.setProperty(AbstractEnvironment.ACTIVE_PROFILES_PROPERTY_NAME, "active");
SpringApplication app = new SpringApplication(AdditionalProfilesReproductionApplication.class);
app.setAdditionalProfiles("additional");
app.run(args);
}
@Autowired
Environment environment;
@Override
public void run(String... args) throws Exception {
System.out.println("Profiles: " + String.join(", ", environment.getActiveProfiles()));
}
}
Spring Boot version: 2.4
After upgrading to Spring Boot 2.4 from Spring Boot 2.3 I noticed that the ordering has changed of how
SpringApplication.additionalProfilesare merged with theConfigurableEnvironment.getActiveProfiles().With Spring Boot 2.3 the ordering is: additional profiles, active profiles
With Spring Boot 2.4 the ordering is: active profiles, additional profiles
When running the test application below with Spring Boot
2.3and Spring Boot2.4you can see this easily in the logging:Spring Boot 2.3.10.RELEASE profiles ordering: additional, activeSpring Boot 2.4.5 profiles ordering: active, additionalThis ordering change also affects the
@ActiveProfilestest annotation. The profiles activated via the annotation now also have a lesser priority then the additional profiles (if you are wondering how we are setting additional profiles in combination with running tests, this is because we are actually using aApplicationStartingEventApplicationListener, registered via thespring.factoriesto call theSpringApplication.setAdditionalProfiles()with an environment specific profile).This change has the effect that our
application-{profile}.ymlproperty sources are now getting different precedence, which caused issues for us when running tests, because property values where not being overridden in the expected order anymore.I wonder if this change in ordering was an intentional one or that it is a mistake. I couldn't find any remarks regarding the change in the changelog. I have also read the https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-Config-Data-Migration-Guide but I couldn't distill this information from that document as well. If the ordering change is intentional then I recommend adding a note in the migration guide.
Test code: