Как переопределить application.properties во время производства в Spring -Boot?
Я использую spring boot и application.properties
для выбора базы данных во время разработки @Configuration @Profile("dev")
.
spring.profiles.active=dev
spring.config.location=file:d:/application.properties
Во время создания я хотел бы создать файл за пределами контекста приложения, который должен быть загружен, а затем активен другой профиль конфигурации с d:/application.properties:
spring.profiles.active=production
Результат: при запуске приложения конфигурация по-прежнему dev
, поэтому каким-то образом дополнительное местоположение файла продуктивных свойств не учитывается. Я что-то пропустил?
spring boot 1.1.0.BUILD-SNAPSHOT
Примечание: этот вопрос НЕ о tomcat.
Ответы
Ответ 1
Я знаю, что вы спросили, как это сделать, но ответ таков: вам не следует этого делать.
Вместо этого имейте application.properties
, application-default.properties
application-dev.properties
и т.д. И переключайте профили с помощью аргументов в JVM: например, -Dspring.profiles.active=dev
Вы также можете переопределить некоторые вещи во время теста, используя @TestPropertySource
В идеале все должно быть под контролем исходного кода, чтобы не было никаких неожиданностей, например Как вы узнаете, какие свойства находятся на вашем сервере, а какие отсутствуют? Что произойдет, если разработчики представят новые вещи?
Spring Boot уже дает вам достаточно способов сделать это правильно.
https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html
Ответ 2
Вы также можете использовать @PropertySources
@PropertySources({
@PropertySource(value = "classpath:application.properties"),
@PropertySource(value = "file:/user/home/external.properties", ignoreResourceNotFound = true)
})
public class Application {
public static void main(String[] args) throws Exception {
ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
}
}
Ответ 3
Я не уверен, что вы можете динамически изменять профили.
Почему бы просто не иметь файл свойств внутренний с свойством spring.config.location, установленным в нужное внешнее местоположение, и файл свойств в этом месте ( за пределами банки) имеют набор spring.profiles.active?
Еще лучше иметь внутренний файл свойств, специфичный для профиля dev (имеет spring.profiles.active = dev) и оставить его таким, и когда вы хотите развернуть его на производстве, укажите новое местоположение для своих свойств файл, который имеет spring.profiles.active = prod:
java -jar myjar.jar --spring.config.location=D:\wherever\application.properties
Ответ 4
UPDATE:
это ошибка в spring см. здесь
свойства приложения вне вашей банки должны находиться в одном из следующих мест, тогда все должно работать.
21.2 Application property files
SpringApplication will load properties from application.properties files in the following locations and add them to the Spring Environment:
A /config subdir of the current directory.
The current directory
A classpath /config package
The classpath root
т.е. это должно работать, когда вы не хотите указывать аргументы командной строки cmd и не используете spring.config.location в базовом приложении app.props:
d:\yourExecutable.jar
d:\application.properties
or
d:\yourExecutable.jar
d:\config\application.properties
см. spring внешний файл конфигурации
Обновление:
вы можете использовать \@Configuration вместе с \@PropertySource.
согласно документу здесь вы можете указать ресурсы где угодно. вы должны просто быть осторожны, когда какой config загружен, чтобы убедиться, что ваша продукция побеждает.
Ответ 5
Я нашел, что для меня работало следующее:
java -jar my-awesome-java-prog.jar --spring.config.location=file:/path-to-config-dir/
с file:
добавлено.
ПОСЛЕДНИЕ ИЗМЕНЕНИЯ
Конечно, эта командная строка никогда не запускается, поскольку она находится в процессе производства.
Скорее я
- [возможно, несколько уровней] сценариев
shell
в исходном управлении с помощью держателей мест для всех частей команды, которые могут измениться (имя jar, путь к config...) -
ansible
сценарии развертывания, которые будут развертывать shell
скриптов и заменяющие заполнители по фактической стоимости.
Ответ 6
В Spring Boot 2 вам нужно будет использовать --spring.config.additional-location=production.properties
Ответ 7
Приоритет конфигурации пружины следующий.
- ServletConfig init Параметр
- Параметр ServletContext init
- Атрибуты JNDI
- System.getProperties()
Таким образом, ваша конфигурация будет переопределена в командной строке, если вы захотите это сделать. Но рекомендуется избегать переопределения, хотя вы можете использовать несколько профилей.