Проблема переопределения свойств приложения в приложении Spring -boot (для профиля), запущенном с помощью свойстваLauncher - SOLVED

У меня возникли трудности с попыткой переопределить свойство, объявленное в файле свойств приложения для профиля в пути к классам, с другим значением, объявленным в файле переопределений файловой системы.

У меня есть автоматически сконфигурированное приложение Spring -boot (т.е. с помощью @EnableAutoconfiguration), которое имеет несколько профилей, которые я запускаю с использованием PropertiesLauncher, а не JarLauncher (причина связана с ограничениями развертывания - Мне нужно развернуть взорванный каталог, а не архив, в файловую систему только для чтения.)

Внутри корня моего приложения у меня есть некоторые свойства приложения для конкретного профиля, например:

application-dev.properties
application-qa.properties
application-prd.properties

И пусть, скажем, ради аргумента, что application-dev.properties содержит:

foo.bar=baz
foo.baz=other

Для любой среды может потребоваться переопределить существующее свойство, а также указать отсутствующий (например, производственный пароль), и проблема, которую я вижу, связана с переопределяющими свойствами, уже объявленными в application-${profile}.properties на пути к классам. (Поставлять свойства, отсутствующие в файле classpath, отлично, это не проблема.)

Скажем, у меня есть файл свойств переопределений в местоположении файловой системы, например:

/local/appname/dev/overrides/application.properties

и я хочу переопределить свойство foo.bar, а также объявить новое свойство foo.password.

Поэтому содержимое файла переопределений:

foo.bar=overridden-value
foo.password=something

Когда я запускаю приложение, я использую командную строку примерно так:

java -Dspring.config.location=file:/local/appname/dev/overrides/ 
     -Dspring.profiles.active=dev 
     org.springframework.boot.loader.PropertiesLauncher 
     --debug &

Проблема, которую я вижу, заключается в том, что, хотя foo.password, свойство не, объявленное в application-dev.properties файле , выбрано, переопределение foo.bar игнорируется - я все еще вижу значение baz от application-dev.properties, а не значение, overridden-value от /local/appname/dev/overrides/application.properties.

При включенной опции --debug я могу видеть, что журнал ConfigFileApplicationListener загрузил как файл переопределений (из файловой системы), так и файл профиля (из пути к классам), в этом порядке.

Я соблазняю, возможно, наивный вывод о том, что, поскольку файл переопределения указан первым, он загружается сначала, а затем переопределяется файлом определенного профиля по умолчанию из пути к классам, который указан ниже. Однако я понимаю, что порядок перечисления в журнале не обязательно коррелирует с поведением. И я попытался изменить порядок путей, объявленных в свойстве spring.config.location, так что classpath: указан до file:..., но это не помогло, и я не уверен, что это все равно, учитывая, что Spring -boot ясно указывает, что местоположения свойств по умолчанию всегда ищутся, даже если вы указали значение для spring.config.location.

Документация Spring -boot очень специфична в отношении порядка, который свойства разрешены для исполняемого JAR файла Spring -boot, в порядке убывания приоритета:

  • Аргументы командной строки.
  • Свойства системы Java (System.getProperties()).
  • Переменные среды ОС.
  • Атрибуты JNDI из java:comp/env
  • A RandomValuePropertySource, который имеет свойства только в random.*.
  • Свойства приложения вне вашей упакованной банки (application.properties включая варианты YAML и профиля).
  • Свойства приложения упакованы внутри вашей банке (application.properties включая варианты YAML и профиля).
  • @PropertySource аннотации в классах @Configuration.
  • Свойства по умолчанию (заданы с помощью SpringApplication.setDefaultProperties).

Обратите внимание на строки 6 и 7 - свойства вне по свойствам внутри вашей банке.

То, что не указано, насколько я могу видеть, и которое может быть источником моей путаницы/проблемы, происходит, когда вы не, используя JAR, но взорванный каталог (и поэтому PropertiesLauncher.)

Если поведение взорванного каталога соответствовало тому, что указано для JAR, я бы ожидал, что значения свойств, объявленных в /local/appname/dev/overrides/application.properties, переопределит одно и то же имя, объявленное в classpath:application-dev.properties, но это не означает, t, похоже, имеет место.

Также отмечено в документации Spring -boot (приложение C.4 на PropertiesLauncher) упоминается свойство loader.home, которое описывается как "... [] Местоположение дополнительного файла свойств, например. /opt/app (по умолчанию - ${user.dir}) '.

Поэтому я попытался использовать loader.home вместо spring.config.location, но безрезультатно.

(Обновление: я также попытался использовать loader.config.location, и у меня есть две заметки: кажется, нужен файл, а не каталог (поэтому его поведение не аналогично spring.config.location) и когда я задал путь к файлу, а не родительский каталог, он все равно не помог.)

Может ли кто-нибудь определить, что я делаю неправильно, или какие неправильные предположения (я) делаю?

Ответ 1

Спасибо, Дейв, ваше предложение было на 100% правильным.

Если я переименую файл свойств в /local/appname/dev/overrides в application-dev.properties, тогда значения свойств из этого файла do переопределяют те, что указаны в classpath:application-dev.properties.

Я был уверен, что вчера попробовал эту комбинацию, но я думаю, что, должно быть, это остановило работу, когда я играл с указанием spring.config.location и получил это неправильно, поэтому он не искал файл переопределения в правильное место.