#!/usr/bin/env bash # The article's title question: why did application-prod.yaml have no effect? # # Because an environment variable was set. Profile-specific files beat non-profile files, # but the whole config-data group sits BELOW environment variables in the documented # precedence list, so a profile file never outranks one. set -euo pipefail set +m cd "$(dirname "$0")/.." source scripts/env.sh { echo "== does application-prod.yaml win? ==" echo echo "demo.datasource-url is set in application.yaml and again in application-prod.yaml." echo echo "--- 1. prod profile active, no environment variable ---" echo "\$ java -jar $JAR --spring.profiles.active=prod" start_app --spring.profiles.active=prod > /dev/null report demo.datasource-url echo echo "--- 2. identical, plus one leftover environment variable ---" echo "\$ DEMO_DATASOURCE_URL=jdbc:postgresql://leftover:5432/orders \\" echo " java -jar $JAR --spring.profiles.active=prod" APP_ENV="DEMO_DATASOURCE_URL=jdbc:postgresql://leftover:5432/orders" \ start_app --spring.profiles.active=prod > /dev/null report demo.datasource-url echo echo "The profile-specific file is still loaded and still holds its value -- it is listed," echo "and it lost. Config data is item 3 in the documented precedence list; OS environment" echo "variables are item 5, and later items win." echo echo "== the full property-source stack, in order ==" echo "\$ curl -s localhost:8080/sources" curl -s "http://127.0.0.1:${APP_PORT}/sources" | python3 -c ' import json,sys for r in json.load(sys.stdin): print(" %2d. %-34s %s" % (r["rank"], r["type"], r["name"][:110]))' stop_app } > docs/output/02-profile-file-loses.txt 2>&1 cat docs/output/02-profile-file-loses.txt