Файл application.properties, що стосується середовища, у програмі Spring Boot [закрито]


85

У моїй програмі Spring Boot я хочу створити файл властивостей, специфічних для середовища. Тип упаковки моєї заявки на війні, і я виконую її у вбудованому tomcat. Я використовую sts і виконую основне з самого sts.

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

У наведеному вище випадку значення env матиме значення local / devl / test / prod

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

  2. Хто читає application.properties у програмі Spring Boot.

  3. Як завантажити файл властивостей конкретного середовища? Наприклад, якщо я встановив uid, pwd, схему тощо у базі даних у файлі властивостей середовища, у такому випадку джерело даних зможе зрозуміти властивості в ньому?

  4. Чи можу я одночасно використовувати файл application.properties та application-local.properties?


Ви читали це ? В основному він підтримується нестандартно.
M. Deinum

Я зробив, але це не працює. Отже, у мене є файл application.properties та файл application-local.properties в одному і тому ж місці. Файл application-local.properties містить властивості, пов'язані з db. application.properties має єдину властивість щодо пружинного mvc. Також я додав -Dprofile = local як конфігурацію налагодження, але це значення не отримується
user3534483

тому що вам потрібно встановити spring.active.profilesтак використовувати -Dspring.active.profiles=local. натомість.
M. Deinum

Ніякого успіху, сер. тож замість -Dprofile я зараз використовую -Dspring.active.profiles = local. А потім у своєму конфігураційному файлі я намагаюся отримати значення String driverClassName = env.getProperty ("driverClassName"); env is the Environment з весни
user3534483

1
Вибачте, погано, змішав навколо :).
M. Deinum

Відповіді:


170

Spring Завантажувальний вже має підтримку для профільних властивостей на основі.

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

-Dspring.profiles.active=local

Це завантажить application.propertiesі application-local.propertiesз останніми переважними властивостями з першого.


1
Чи можемо ми замінити використання властивостей програми іншим файлом для певного профілю, не завантажуючи обидва? Для тестів чи розробників, наприклад?
Хассам Абделілла

1
М. Deinum, у мене теж є схожа проблема, у мене є application.yml та application-qa.yml, і я дав -Dspring.profiles.active = qa, обидва файли читаються, але властивості application-qa.yml не перезаписують властивості з application.yml, я завжди бачу властивості лише з application.yml? чи є спосіб вказати пріоритет?
Suresh Chaganti

5
Привіт обом! Це може вирішити ваші проблеми. docs.spring.io/spring-boot/docs/current/reference/html/… Приклад: mkyong.com/spring-boot/…
Anand Varkey Philips

Я пишу код для aws lambda і можу передати цей ключ = значення як значення середовища - до якого можна отримати доступ за допомогою System.getenv () - чи буде це працювати?
Абдеалі Чанданвала

У мене є 4 файлу application- {profile} .properties. І я хочу запустити один і той же файл jar в іншому середовищі, скажімо, dev, test, prod. Тож я не можу використовувати -Dspring.profiles.active = local. Будь ласка, виправте мене, якщо мені чогось не вистачає.
Ashish Burnwal

24

Так, ти можеш. Оскільки ви використовуєте весну, перевірте @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

У цьому прикладі ім'я буде замінено на application-test-properties тощо.


2
Проблема в тому, що $spring.profiles.active}це рядок, розділений масивом / комою. Тож він може робити не те, що очікуєш / хочеш, коли активовано кілька профілів.
M. Deinum

Це правда, але чудово працює для двох профілів - одного за замовчуванням і одного, визначеного у PropertySource. Для більш вдосконаленого управління майном, я думаю, вам доведеться шукати за межами Весни. Також PropertySource читається лише під час запуску. Інші, більш вдосконалені бібліотеки для обробки властивостей, також можуть змінювати час роботи властивостей.
Tzen

2
Це спрацювало, але я досі не розумію, чому мені довелося це робити вручну. В одному з моїх інших сховищ мені не доводилось цього робити.
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-фактора, не повинно бути специфічним для охорони навколишнього середовища проживання лише в оточенні.

Як ми робимо для CI CD

  • Побудуйте Spring один раз і просуньте в інше середовище, в цьому випадку, якщо у нас Spring jar має все середовище, це буде мати ризик безпеки, маючи всю змінну середовища в GIT
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.