Настройка активного профиля и расположения конфигурации из командной строки при весенней загрузке

167

У меня есть приложение весенней загрузки.

У меня есть три профиля в моем приложении -> разработка, подготовка и производство . Итак, у меня есть 3 файла

  1. Приложение-development.yml
  2. Приложение-staging.yml
  3. Приложение-production.yml

Мой application.yml находится внутри src/main/resources. Я установил активный профиль в application.yml как:

spring:
  profiles.active: development

Другие 3 специфических профиля профиля находятся в C:\configпапке.

Я использую плагин Gradle для затмения. Когда я пытаюсь выполнить « bootRun », я задаю аргументы командной строки в моей конфигурации gradle в eclipse как

 -Dspring.profiles.active=staging -Dspring.config.location=C:\Config

Тем не менее, свойство командной строки не отражается, и мой активный профиль всегда устанавливается как разработка (это то, что я упомянул в файле application.yml). Кроме того, в папке C: \ Config не выполняется поиск определенных конфигурационных файлов профиля.

Я думаю, что я что-то здесь упускаю. Я пытался понять это в течение последних 2 дней. Но не повезло. Я был бы очень признателен за любую помощь.

О-О-N
источник
Можете ли вы также добавить свою bootRunкомандную строку
Biju Kunjummen
Я запускал его из затмения, а не из командной строки до сих пор. Но я попытался запустить с использованием "gradle bootRun -Dspring.config.location = C: \ Config \ -Dspring.profiles.active = staging" и получил тот же результат.
O-OF-N

Ответы:

347

Есть два разных способа добавить / переопределить свойства пружины в командной строке.

Вариант 1: Свойства системы Java (Аргументы ВМ)

Важно, чтобы параметры -D были перед вашим application.jar, иначе они не будут распознаны.

java -jar -Dspring.profiles.active=prod application.jar

Вариант 2: программные аргументы

java -jar application.jar --spring.profiles.active = prod --spring.config.location = c: \ config
RenRen
источник
46
Порядок параметров -D действительно важен :)
Мартин
3
Как вы можете достичь этого при развертывании, скажем, контейнера Tomcat? В этом случае я просто помещаю свою войну в папку webapps tomcat, как мне предоставить информацию о профиле? путем установки системных свойств?
prayagupd
@prayagupd Да, вы можете настроить системные свойства в вашем bash_profile.
наилучшие пожелания
2
@maneesh Да, я использую переменную env, SPRING_PROFILES_ACTIVE экспортированную через ~/.bash_profile. export SPRING_PROFILES_ACTIVE=e2e
prayagupd
1
Когда вы говорите, что порядок важен: можем ли мы передать оба аргумента: -Dspring.profile.active и -Dspring.config.location так, чтобы профиль был установлен в соответствии с первым аргументом, а файл свойств был выбран в соответствии с вторые аргументы? Например:java -Dspring.profiles.active=$ENV -Dspring.config.location=file:///aws-secrets-manager/properties/application-$ENV.properties /code/app.jar
Прамод Сетлур
27

Моя лучшая практика - определять это как аргумент виртуальной машины "-D". Обратите внимание на различия между пружинными ботинками 1.x и 2.x.

Профили для включения могут быть указаны в командной строке:

Spring-Boot 2.x

-Dspring-boot.run.profiles=local

Spring-Boot 1.x

-Dspring.profiles.active=local

Пример использования с Maven:

Spring-Boot 2.x

mvn spring-boot:run -Dspring-boot.run.profiles=local

Spring-Boot 1.x

mvn spring-boot:run -Dspring.profiles.active=local

Обязательно разделяйте их запятой для нескольких профилей:

mvn spring-boot:run -Dspring.profiles.active=local,foo,bar
mvn spring-boot:run -Dspring-boot.run.profiles=local,foo,bar
Сма Ма
источник
Вы имеете в виду весну / весна-ботинок? (Весна 1х и весна 2х)!
smilyface
1
@smilyface весенний ботинок. весенняя загрузка также доступна в разных версиях: mvnrepository.com/artifact/org.springframework.boot/spring-boot
Sma Ma
2
Я использую spring-boot 2.1.3, и -Dspring-boot.run.profiles=localне работал, -Dspring.profiles.active=localработал.
Донхуа Лю
spring-boot 2.2.0: работают оба: -Dspring-boot.run.profilesи-Dspring.profiles.active
Григорий Кислин
18

Я должен был добавить это:

bootRun {
    String activeProfile =  System.properties['spring.profiles.active']
    String confLoc = System.properties['spring.config.location']
    systemProperty "spring.profiles.active", activeProfile
    systemProperty "spring.config.location", "file:$confLoc"
}

И теперь bootRun подбирает профиль и конфигурационные места.

Большое спасибо @jst за указатель.

О-О-N
источник
7
Это может быть еще более простым следующим образом : bootRun { systemProperties = System.properties }. Эта команда скопирует все параметры, переданные с помощью -Dключа с теми же ключами, на systemPropertyкарту.
edufinn
кажется, это решение только для gradle, нет ли общего решения?
user1767316
1
Куда именно вы добавляете это? Где-нибудь в файле build.gradle или в определенном месте в файле?
энтузиаст Scala
16
-Dspring.profiles.active=staging -Dspring.config.location=C:\Config

не является правильным.

должно быть:

--spring.profiles.active=staging --spring.config.location=C:\Config
Майкл Инь
источник
3
Это приводит к ошибке «Нераспознанная опция: --spring.config.location»
Джеймс Уоткинс
-D - это правильный способ установки свойств системы Java. Что-то - это параметр bash.
Xdg
--spring.profiles.active работать для меня, то же самое я упомянул из docs.spring.io/spring-boot/docs/current/reference/html/…
Пушкарь
Это также работает для меня, когда я использую Run As -> Java-приложение в Eclipse
Оливье Буасе
11
на самом деле ОБА верны, это зависит от того, как это используется: это может быть java -Dspring.profiles.active=staging -Dspring.config.location=C:\Config your-spring-boot-app.jarИЛИjava your-spring-boot.jar --spring.profiles.active=staging --spring.config.location=C:\Config
Декстер Легаспи
9

Вы можете использовать следующую командную строку:

java -jar -Dspring.profiles.active=[yourProfileName] target/[yourJar].jar
Роллен Холт
источник
9

Есть другой способ, установив переменную ОС , SPRING_PROFILES_ACTIVE .

например:

SPRING_PROFILES_ACTIVE=dev gradle clean bootRun

Справка: Как установить активные профили Spring

Ротин Сен
источник
Да, и это избавляет от необходимости обходиться с тем, как Gradle передает системные свойства приложения.
ben3000
Это аккуратный способ. Его также следует использовать для установки пользователей базы данных, паролей и других конфиденциальных конфигураций, чтобы они не проверялись при управлении версиями.
Игорь Донин
7

При настройке профиля через плагин Maven вы должны сделать это черезrun.jvmArguments

mvn spring-boot:run -Drun.jvmArguments="-Dspring.profiles.active=production"

С опцией отладки:

mvn spring-boot:run -Drun.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 -Dspring.profiles.active=jpa"

Я видел эту поездку много людей вверх .. надеюсь, это помогает

Jarc
источник
1
изменился на mvn spring-boot:run -Dspring-boot.run.profiles=foo,bar, см .: docs.spring.io/spring-boot/docs/current/maven-plugin/examples/…
rwenz3l
@ rwenz3l Спасибо! это работает для меня, просто обновил проект с Spring Boot 1 до 2. Теперь я просто добавляю их все в моем bashrc ... springmvn="mvn clean spring-boot:run -Dspring.profiles.active=local -Dspring-boot.run.profiles=local"
Джон Смит,
5

Я думаю, что ваша проблема, вероятно, связана с тем, что ваш spring.config.location не заканчивает путь с помощью "/".

Цитировать документы

Если spring.config.location содержит каталоги (в отличие от файлов), они должны заканчиваться на / (и будут добавлены с именами, сгенерированными из spring.config.name перед загрузкой).

http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config-application-property-files

Jst
источник
Спасибо за указание на это. Однако при запуске -Dspring.profiles.active = staging -Dspring.config.location = C: \ Config \ также возникает та же проблема. Даже активный профиль не отражается. Я думаю, по какой-то причине моя командная строка не пропускается.
O-OF-N
1
Вы должны следовать советам, данным в этом вопросе, чтобы передать аргументы в bootRun stackoverflow.com/questions/25079244/…
jst
Спасибо. Это действительно помогло.
O-OF-N
4

Ответ Михаэля Инь верен, но, похоже, требуется лучшее объяснение!

Многие из вас упоминали, что -Dэто правильный способ указать параметры JVM, и вы абсолютно правы. Но Майкл также прав, как указано в документации по Spring Boot Profiles .

В документации неясно, что это за параметр: --spring.profiles.activeэто не стандартный параметр JVM, поэтому, если вы хотите использовать его в своей среде IDE, заполните правильные поля (то есть аргументы программы)

Эрик Тайкс
источник
0

Если вы используете Gradle:

-Pspring.profiles.active=local
FredFlinstone
источник