У меня возникли трудности с попыткой переопределить свойство, объявленное в файле свойств приложения для профиля в пути к классам, с другим значением, объявленным в файле переопределений файловой системы.
У меня есть автоматически сконфигурированное приложение 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
) и когда я задал путь к файлу, а не родительский каталог, он все равно не помог.)
Может ли кто-нибудь определить, что я делаю неправильно, или какие неправильные предположения (я) делаю?