Как переопределить 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

Приоритет конфигурации пружины следующий.

  1. ServletConfig init Параметр
  2. Параметр ServletContext init
  3. Атрибуты JNDI
  4. System.getProperties()

Таким образом, ваша конфигурация будет переопределена в командной строке, если вы захотите это сделать. Но рекомендуется избегать переопределения, хотя вы можете использовать несколько профилей.