See https://github.com/spring-projects/spring-boot/issues/22693 for the introduction of failing hard and https://github.com/spring-projects/spring-boot/issues/22944 which relaxed things a little to allow its use in non-profile-specific documents. As things stand, it would appear that spring.profiles.include
is being silently ignored when used in a profile-specific document.
At the least, I think we should update the release notes on the wiki as there's no mention of spring.profiles.include
at the moment. Ideally, I think we'd also fail hard when spring.profiles.include
is used in a profile-specific document. Flagging for team attention to see what the rest of the team thinks.
Comment From: perilbrain
But please allow use of legacy flags. I have reverted to old method as the new method is yet unable to address few problems( #24720 ) and will take some time to mature when new issues pop up.
Comment From: philwebb
I've been unable to replicate this with the latest 2.4.x. @perilbrain Do you have a sample project that shows the silent failure?
Comment From: perilbrain
I've been unable to replicate this with the latest 2.4.x. @perilbrain Do you have a sample project that shows the silent failure?
In #24720 I have attached a file. All you need is to remove spring.config.use-legacy-processing=true
from application.properties
after bootstrapping. Here is what you'll see
With application.properties
like:
# ==========================
# Dont touch legacy support
# ==========================
spring.config.use-legacy-processing=true
spring.profiles.active=local
result will be
$> http :8080/who
Active Profile Details: envType=application-local.properties, password=prod, common='from_common_profile'
When legacy removed in application.properties
# ==========================
# Dont touch legacy support
# ==========================
# spring.config.use-legacy-processing=true
spring.profiles.active=local
result will be
$> http :8080/who
Active Profile Details: envType=application-local.properties, password=MissingPassword, common='MissingCommon'
And yes application keeps on running without any hard fail.
Comment From: philwebb
Thanks @perilbrain, I made a simple typo which is why my test didn't fail 🤦
Comment From: konradczajka
Hi, I'm not sure whether I should create a separate issue for my problem so I'll describe my problem here and, if asked, write it down again.
I'm currently in a process of migrating our services configuration from the old solution to Spring Cloud. Yesterday I created a little application which would be used for demonstrating the solution to my colleagues. I used the newest version including the bugfix for this issue. My app crashed. Reverting the Spring Boot version to 2.4.1 fixed the problem.
Our configuration repository structure looks quite regular. An excerpt:
/cloud-config-demo/cloud-config-demo.yml
/application.yml
/application-rabbitmq.yml
I wanted to reduce each app's configuration that is provided at startup to the bare minimum (i.e. the config server uri only, all other stuff including active profiles declarations would be externalized) so I declared that my demo app uses rabbitmq properties by adding spring.profiles.include=rabbitmq
to demo-app.yml
. On 2.4.1 everything works fine:
- The app is started without any profile
- It makes a request to the config server using the default profile: <config-server-uri>/cloud-config-demo/default
- In response it receives both "default" and profiles-specific property sources (including application-rabbitmq.yml
)
- The app notices and applies the additional profile defined in cloud-config-demo.yml
and then applies profile-specific configuration (application-rabbitmq.yml
)
After upgrading the Spring Boot to 2.4.2 the app crashes at the very start with exception:
21:23:42.241 [main] ERROR org.springframework.boot.SpringApplication - Application run failed
org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property 'spring.profiles.include' imported from location '[ConfigServerConfigDataResource@a43ce46 uris = array<String>['http://config-server'], optional = false, profiles = list['default']]' is invalid in a profile specific resource [origin: Config Server ssh://config-repo/cloud-config-demo/cloud-config-demo.yml:8:14]
Initially I thought that maybe a dash in the app (and its config file) name is interpreted as a name/profile separator but when I moved spring.profiles.include
property from cloud-config-demo.yml
to application.yml
I got the same error (but mentioning the application.yml
).
This is a slightly trimmed response from the config server (<config-server-uri>/cloud-config-demo/default
):
{
"label": null,
"name": "cloud-config-demo",
"profiles": [
"default"
],
"propertySources": [
{
"name": "ssh://config-repo/cloud-config-demo/cloud-config-demo.yml",
"source": {
"spring.profiles.include": "rabbitmq"
}
},
{
"name": "ssh://config-repo/application-rabbitmq.yml",
"source": {
"spring.rabbitmq.addresses": "...",
"spring.rabbitmq.password": "...",
"spring.rabbitmq.username": "..."
}
},
{
"name": "ssh://config-repo/application.yml",
"source": {
...
}
}
],
"state": null,
"version": "..."
}
InvalidConfigDataPropertyException
throws an exception during processing of ConfigDataEnvironmentContributor
with this configuration. The contributor is marked as profileSpecific
and therefore it's forbidden for it to contain "profiles properties".
In my opinion it should be permitted to specify profiles in an external configuration as long as particular file is not profile-specific.
I hope what I described makes sense. I'd gladly prepare a demo that reproduces this behavior. Maybe it's not the Spring Boot's but Spring Cloud's problem. Or maybe there's a reason I shouldn't specify profiles in my config repo. I'd be very grateful for any response.
Comment From: wilkinsona
@konradczajka Thanks for letting us know. I'm not sure that I have followed the description of the problem. For example, it's not clear to me where demo-app.yml
fits in. This issue's closed and changes for it were released in 2.4.2 so to allow us to continue to investigate, please open a new issue. If you do create one, please include a minimal sample that reproduces the problem either as a zip attached to the issue or as a link to a separate repository on GitHub. A sample will help to remove any confusion about how you have set things up and the role that each file is intended to have.
Comment From: konradczajka
@wilkinsona Thank you for the reply. It was a mistake - it should be cloud-config-demo.yml
instead of demo-app.yml
. I'' create a separate issue regardless.
Comment From: workmanw
We ran into this issue when upgrading to 2.4.2 from 2.3.x. We were using spring.profiles.include
to bootstrap logging settings and it was not being silently ignored. It was actually working as expected for us. Perhaps it's due to how early in the life cycle Spring initializes logging. Regardless this is a breaking change for us and so far I have not been able to find a work around. Using spring.profiles.active
does not work because logging configuration is already initialized when this value is resolved and thus it is too late.
Comment From: philwebb
@workmanw It sounds like that might be a related but different issue. Can you open a new report and if possible provide a sample application that we can run?