Файл application.properties для конкретной среды в приложении Spring Boot [закрыто]

87

В моем приложении Spring Boot я хочу создать файл свойств для конкретной среды. Тип упаковки моего приложения на войне, и я выполняю его во встроенном tomcat. Я использую петли, а основную выполняю из самой петли.

  1. Могу ли я получить файл свойств для конкретной среды, например application - $ {env-value} .properties?

В приведенном выше случае значение env будет иметь значения local / devl / test / prod

  1. Где установить файл значений env? Для локального я могу установить его как аргумент jvm через sts

  2. Кто читает application.properties в приложении Spring Boot.

  3. Как загрузить файл свойств конкретной среды? Например, если я установлю uid, pwd, схему и т. Д. Базы данных в файле свойств конкретной среды, в этом случае сможет ли источник данных понять свойства в нем?

  4. Могу ли я использовать файл application.properties и application-local.properties одновременно?

user3534483
источник
Читали ли вы это ? Он в основном поддерживается "из коробки".
M. Deinum
Я сделал, но это не работает. Итак, у меня есть файл application.properties и файл application-local.properties в одном месте. Файл application-local.properties содержит свойства, связанные с базой данных. application.properties имеет единственное свойство, относящееся к spring mvc. Также я добавил -Dprofile = local в качестве конфигурации отладки, но это значение не подбирается
user3534483
потому что вам нужно установить spring.active.profilesтак использовать -Dspring.active.profiles=local. вместо.
M. Deinum
Нет успеха, сэр. поэтому вместо -Dprofile я теперь использую -Dspring.active.profiles = local. И затем в моем файле конфигурации я пытаюсь получить значение String driverClassName = env.getProperty ("driverClassName"); env - это среда из весны
user3534483
1
Извините за плохую, перепутал :).
M. Deinum

Ответы:

173

Spring Загрузочный уже имеет поддержку для профиля свойства основе .

Просто добавьте application-[profile].propertiesфайл и укажите профили для использования с помощью spring.profiles.activeсвойства.

-Dspring.profiles.active=local

Это загрузит application.propertiesи application-local.propertiesс последними переопределяющими свойствами из первого.

М. Дейнум
источник
1
Можем ли мы переопределить использование свойств приложения другим файлом для определенного профиля, не загружая их обоих? Например, для тестов или разработчиков?
Hassam Abdelillah
1
M. Deinum, у меня тоже есть похожая проблема, у меня есть application.yml и application-qa.yml, и я дал -Dspring.profiles.active = qa, оба файла читаются, но свойства из application-qa.yml не перезаписывают свойства из application.yml, я всегда вижу только свойства из application.yml? есть ли способ указать приоритет?
Суреш
5
Привет обоим, это может решить ваши проблемы. docs.spring.io/spring-boot/docs/current/reference/html/… Пример: mkyong.com/spring-boot/…
Ананд Варки Филипс
Я пишу код для лямбда aws и могу передать этот ключ = значение в качестве значения среды, доступ к которому можно получить с помощью System.getenv (). Будет ли это работать?
Abdeali Chandanwala
У меня 4 файла application- {profile} .properties. И я хочу запустить один и тот же файл jar в другой среде, скажем, dev, test, prod. Поэтому я не могу использовать -Dspring.profiles.active = local. Пожалуйста, поправьте меня, если я что-то упускаю.
Ashish Burnwal
25

Да, ты можешь. Поскольку вы используете Spring, проверьте@PropertySource аннотацией.

Аннотируйте свою конфигурацию с помощью

@PropertySource("application-${spring.profiles.active}.properties")

Вы можете называть это как угодно и при желании добавлять несколько файлов свойств. Может быть удобно, если у вас есть больше наборов и / или значений по умолчанию, которые принадлежат всем средам (также можно записать с помощью @PropertySource {..., ..., ...}).

@PropertySources({
  @PropertySource("application-${spring.profiles.active}.properties"),
  @PropertySource("my-special-${spring.profiles.active}.properties"),
  @PropertySource("overridden.properties")})

Затем вы можете запустить приложение со средой

-Dspring.active.profiles=test

В этом примере name будет заменено на application-test-properties и так далее.

Цзен
источник
3
Проблема в том, что $spring.profiles.active}это строка, разделенная массивом / запятыми. Таким образом, он может не делать того, что вы ожидаете / хотите, когда активны несколько профилей.
M. Deinum
Это правда, но отлично работает для двух профилей - одного по умолчанию и одного, определенного с помощью PropertySource. Для более продвинутой обработки свойств, я думаю, вам придется искать за пределами Spring. Также PropertySource читается только во время запуска. Другие, более продвинутые библиотеки для обработки свойств также могут изменять свойства во время выполнения.
Tzen
2
Это сработало, но я до сих пор не понимаю, почему мне пришлось делать это вручную. В одном из моих других репозиториев мне не пришлось этого делать.
The Java Guy
7

мы можем сделать так:

в application.yml :

spring:
  profiles:
    active: test //modify here to switch between environments
    include:  application-${spring.profiles.active}.yml

в application-test.yml :

server:
  port: 5000

и в application-local.yml :

server:
  address: 0.0.0.0
  port: 8080

затем весенняя загрузка запустит наше приложение, как мы хотим.

Каракатица
источник
2
Разве вы не запрограммировали активный профиль таким образом ?? :(
Анна Медюх
0

Моя точка зрения, В этом случае я не прошу разработчика создать всю связанную среду за один раз, что приведет к риску раскрытия производственной конфигурации конечному разработчику.

согласно 12-Factor, не должно быть специфическим для среды, проживать только в Enviornment.

Как мы делаем для CI CD

  • Создайте Spring один раз и продвигайте его в другую среду, в этом случае, если у нас есть Spring jar, в котором есть вся среда, это риск безопасности, поскольку все переменные среды в GIT
Karthik_Rajendiran
источник