Как активировать профиль загрузки Spring при запуске из IntelliJ?


134

У меня 5 сред:

 - local (my development machine)
 - dev
 - qc
 - uat
 - live
 - staging

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

 - application.properties  (containing common properties)
 - application-local.properties
 - application-dev.properties
 - application-qc.properties
 - application-uat.properties
 - application-live.properties

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

Я пробовал добавить:

--spring.profiles.active = локальная

к конфигурации запуска в параметрах скрипта.

Я пробовал добавить

-Dspring.profiles.active = локальная

к конфигурации запуска в параметрах ВМ.

Ни работать. Я продолжаю видеть сообщение INFO при запуске, в котором говорится: Активный профиль не установлен, возврат к профилям по умолчанию: по умолчанию

Если я запустил свое приложение из командной строки Windows, используя

gradle bootRun

но сначала я установил переменную среды

set SPRING_PROFILES_ACTIVE=local

Дальше все работает.

Итак, мой вопрос: как мне активировать свой локальный загрузочный профиль Spring при запуске bootRun из IntelliJ?


1
Почему вы запускаете там приложение через gradle? Не было бы в 10 раз удобнее использовать конфигурацию запуска? Есть поле, в котором вы можете установить профили для включения ...
Стефан Николл

Я использую конфигурацию запуска в IntelliJ, как описано выше. Это не работает.
dleerob

2
Нет, это не так. Я говорю о «Конфигурации запуска Spring Boot» Run -> Edit configuration> New> Spring Boot.
Стефан Николл

Ааа, да, я отошел от конфигурации запуска Spring Boot, поскольку мне нужно было расширить project.properties до application.properties в моем build.gradle, и если я использовал конфигурацию запуска Spring Boot, похоже, это не сработало. Я постараюсь решить эту проблему, а затем, возможно, я смогу просто использовать поле активного профиля, как вы предложили
dleerob

1
Использование конфигурации Spring Boot кажется больше проблем, чем того стоит. «Make» просто копирует ресурсы и не фильтрует / не изменяет их согласно сценарию сборки. Затем указание запустить сборку из gradle вместо make просто приводит к зависанию выполнения. Если вместо этого я использую bootRun вместе с записью в моей среде, как указано ниже, все работает нормально.
dleerob

Ответы:


196

Я добавил -Dspring.profiles.active=testв параметры виртуальной машины, а затем повторно запустил эту конфигурацию. Это сработало отлично.

Это может быть установлено

  • Выбор Run | Edit Configurations...
  • Перейти на Configurationвкладку
  • Разверните Environmentраздел, чтобы увидетьVM options

Я застрял в той же ситуации, но для проекта Maven. Спасибо за помощь. Мы установили параметр виртуальной машины для каждого тестового файла.
Sri9911

2
У меня тоже не работает. Я использую gradle и два модуля (api и ui)
Virkom

1
У меня тоже не работает, здесь также используется gradle.
IARI

Привет, у меня такая же проблема, но это исправление не решает ее. что здесь подразумевается под перезапуском конфигурации? это так же повторное выполнение задачи?
user1456110

Я провел этот конкретный тест после его редактирования, как показано.
Том

82

Если вы действительно используете конфигурации весенней загрузки (в настоящее время поддерживаются только в Ultimate Edition), легко предварительно настроить профили в настройке «Активные профили».

введите описание изображения здесь


1
Спасибо, я уверен, что это сработает, однако я не использую конфигурацию запуска Spring Boot, я использую конфигурацию запуска Gradle, в которой нет поля «Активные профили». Моя сборка gradle фильтрует и изменяет некоторые файлы свойств, которые он копирует в каталог сборки, поэтому я использую для этого конфигурацию запуска Grade.
dleerob

В качестве ответа выше отметил: если это не работает для вас, убедитесь , что вы передаете в argsв вашем Application.main()напримерSpringApplication.run( Application.class, args );
Xaero Degreaz

Эта функция поддерживается только в версии Ultimate.
Julien Malige

Спасибо @JulienMalige за указание на это. Отредактирую свой ответ.
Даниэль


9

Spring Boot, похоже, изменил способ чтения параметров виртуальной машины по мере его развития. Вот как можно попробовать, когда вы запускаете приложение в Intellij и хотите активировать какой-то профиль:

1. Измените параметры виртуальной машины.

Откройте «Изменить конфигурацию» в «Выполнить» и в «Параметры ВМ» добавьте: -Dspring.profiles.active=local

На самом деле он работает с одним моим проектом с Spring Boot v2.0.3.RELEASEи Spring v5.0.7.RELEASE, но не с другим проектом с Spring Boot v2.1.1.RELEASEи Spring v5.1.3.RELEASE.

Кроме того, при работе с Maven или JAR люди упоминали об этом:

mvn spring-boot:run -Drun.profiles=dev

или

java -jar -Dspring.profiles.active=dev XXX.jar

(См. Здесь: как использовать профили Spring Boot )

2. Передача аргументов JVM

Где-то упоминается, что Spring изменяет способ запуска процесса приложений, если вы указываете некоторые параметры JVM; он разветвляет другой процесс и не передает полученный аргумент, поэтому это не работает. Единственный способ передать ему аргументы:

mvn spring-boot:run -Dspring-boot.run.jvmArguments="..."

Опять же, это для Maven. https://docs.spring.io/spring-boot/docs/current/maven-plugin/examples/run-debug.html

3. Настройка (приложение) env var

Что мне подходит для второго проекта, так это установка переменной среды, как упоминалось в ответе выше: «Изменить конфигурацию» - «Переменная среды» и:

SPRING_PROFILES_ACTIVE=local

1
На самом деле env var должен быть SPRING_PROFILES_ACTIVE.
Джош М.

Я добавил его в «Конфигурацию запуска» в IDEA «Параметры виртуальной машины», например «spring.profiles.active», и он работает. Может быть, другая форма, такая как urs, используется для всей системы в свойствах системы?
WesternGun

Если вы добавляете его ~/.profileили что-то подобное, вам нужно использовать SPRING_PROFILES_ACTIVE- spring.profiles.activeскорее всего, работает только как аргумент в командной строке.
Джош М.

1
А ... значит, вы имеете в виду то же, что и я подозревал; реальная система env, а не только приложение env. ОК, я делаю правку.
WesternGun

8

В итоге я добавил в свой build.gradle следующее:

bootRun {
  environment SPRING_PROFILES_ACTIVE: environment.SPRING_PROFILES_ACTIVE ?: "local"
}

test {
  environment SPRING_PROFILES_ACTIVE: environment.SPRING_PROFILES_ACTIVE ?: "test"
}

Итак, теперь при запуске bootRun из IntelliJ по умолчанию используется «локальный» профиль.

В других наших средах мы просто установим переменную среды SPRING_PROFILES_ACTIVE в Tomcat.

Я получил это из комментария, найденного здесь: https://github.com/spring-projects/spring-boot/pull/592


6

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

public static final void main(String... args) {
    SpringApplication.run(Application.class, args);
}

Спасибо за ответ и предложение, однако я передаю аргументы.
dleerob

Это фактически устранило мою проблему. По какой-то причине, когда я создавал проект с помощью Gradle, он не генерировал мой Applicationкласс автоматически, поэтому делал это вручную из памяти. Пропустил этот argsшаг, поэтому поле «Активные профили» в конфигурации запуска не работало - мне пришлось вручную передать его -Dspring.profiles.activeв поле параметров виртуальной машины.
Xaero Degreaz 01

3

Я использую Intellij Community Edition. Перейдите в «Запуск / отладка конфигураций»> вкладка «Runner»> «Переменные среды»> нажмите кнопку «...». Добавить: SPRING_PROFILES_ACTIVE = local

spring.profiles.active



2

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

-Dspring.profiles.active=local

0

Попробуй это. Отредактируйте файл build.gradle следующим образом.

ext { profile = project.hasProperty('profile') ? project['profile'] : 'local' }


-3

Устанавливается -Dspring.profiles.active=localв аргументах программы.


Я удалил цитаты из своего вопроса выше. На самом деле я не использую кавычки, я просто пытался показать, что именно я
вводил в

5
ты про варианты ВМ!
Михаил

Этот ответ вводит в заблуждение, поскольку аргументы программы не распознаются приложением!
yuranos

Этот ответ не сработает, как уже упоминалось другими людьми, он должен быть в параметрах виртуальной машины в IntelliJ Idea, а не в аргументах программы
abstractKarshit
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.