it-swarm.com.ru

Как переопределить application.properties во время производства в 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, поэтому дополнительное расположение файла продуктивных свойств не учитывается. Я что-то пропустил?

пружинный ботинок 1.1.0. BUILD-SNAPSHOT

Примечание: этот вопросНЕabout Tomcat .

32
membersound

Я знаю, ты спросил, как это сделать.

Но ответ таков: вы не должны этого делать.

Вы можете иметь application.properties application-default.properties application-dev.properties и т.д.

вы можете переключать профили с помощью аргументов командной строки в JVM

вы можете переопределить некоторые вещи во время теста, используя @TestPropertySource

В идеале все должно быть под контролем исходного кода, чтобы не было никаких сюрпризов - как узнать, какие свойства находятся на вашем сервере, а какие отсутствуют. Что произойдет, если разработчики представят новые вещи.

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

Spring boot уже дает вам достаточно способов сделать это правильно.

10
Kalpesh Soni

Вы также можете использовать @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);

    }


}
10
Saurabh

Я не уверен, что вы можете динамически менять профили.

Почему бы просто не иметь файл internal properties с свойством spring.config.location , установленным в желаемое внешнее местоположение, а файл свойств в этом месте (вне фляги) имеет spring.profiles .active свойство установлено?

Еще лучше, если у вас есть внутренний файл свойств, специфичный для профиля dev (имеет spring.profiles.active = dev), и оставьте его таким, а когда вы хотите развернуть его в рабочей среде, укажите новое местоположение для файла свойств, в котором есть spring. .profiles.active = прод:

Java -jar myjar.jar --spring.config.location=D:\wherever\application.properties
7
Gabriel Ruiu

ОБНОВЛЕНИЕ: Это ошибка весной см. здесь

свойства приложения вне вашей фляги должны быть в одном из следующих мест, тогда все должно работать.

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

см. пружинный внешний конфигурационный документ

Обновление: Вы можете использовать\@Configuration вместе с\@PropertySource . В соответствии с документом здесь вы можете указывать ресурсы где угодно. Вы должны быть осторожны, когда какой конфиг загружен, чтобы убедиться, что ваш продукт выиграл.

4
dasAnderl ausMinga

Я нашел следующее работало для меня:

Java -jar my-awesome-Java-prog.jar --spring.config.location=file:/path-to-config-dir/

сfile:добавлено.

Позднее редактирование

Конечно, эта командная строка никогда не запускается, как в рабочей среде.

Скорее у меня есть 

  • [возможно, несколько слоев] сценариев Shell в системе управления версиями с заполнителями для всех частей команды, которые могут измениться (имя jar, путь к config ...)
  • Сценарии развертывания ansible, которые будут развертывать сценарии Shell и заменять заполнители фактическим значением.
1
avi.elkharrat

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

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

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

0
Himadri Mandal