Мы работаем над веб-приложением Spring Boot , и база данных, которую мы используем, - MySql ;
у нас есть настройки, которые мы сначала тестируем локально (значит, нам нужно установить MySql на наш ПК);
затем мы нажимаем на Bitbucket ;
Jenkins автоматически обнаруживает новый push-запрос к Bitbucket и выполняет сборку на нем (для того, чтобы передать Jenkins mvn build, нам также нужно установить MySql на виртуальные машины, на которых работает Jenkins).
если сборка Jenkins проходит успешно, мы отправляем код в наше приложение в OpenShift (используя плагин развертывания Openshift в Jenkins).
Проблема, которую мы имеем, как вы, возможно, уже поняли, заключается в том, что:
в
application.properties
мы можем не трудно кодировать информацию MySql. Поскольку наш проект будет выполняться в 3 разных местах ( локальном , Jenkins и OpenShift ), нам нужно сделать поле источника данных динамичнымapplication.properties
(мы знаем, что есть разные способы сделать это, но мы сейчас работаем над этим решением).spring.datasource.url = spring.datasource.username = spring.datasource.password =
Решение, которое мы придумали, заключается в том, что мы создаем системные переменные среды локально и в Jenkins vm (называя их так же, как их называет OpenShift) и присваивая им правильные значения соответственно:
export OPENSHIFT_MYSQL_DB_HOST="jdbc:mysql://localhost"
export OPENSHIFT_MYSQL_DB_PORT="3306"
export OPENSHIFT_MYSQL_DB_USERNAME="root"
export OPENSHIFT_MYSQL_DB_PASSWORD="123asd"
Мы сделали это, и это работает. Мы также проверили, Map<String, String> env = System.getenv();
что переменные окружения могут быть преобразованы в переменные Java как таковые:
String password = env.get("OPENSHIFT_MYSQL_DB_PASSWORD");
String userName = env.get("OPENSHIFT_MYSQL_DB_USERNAME");
String sqlURL = env.get("OPENSHIFT_MYSQL_DB_HOST");
String sqlPort = env.get("OPENSHIFT_MYSQL_DB_PORT");
Теперь осталось только использовать эти переменные java в нашем, application.properties
и это то, с чем у нас проблемы.
В какой папке, и как нам нужно назначить password
, userName
, sqlURL
и sqlPort
переменные , application.properties
чтобы иметь возможность видеть их и как мы включаем их в application.properties
?
Мы перепробовали много вещей, одна из которых:
spring.datasource.url = ${sqlURL}:${sqlPort}/"nameofDB"
spring.datasource.username = ${userName}
spring.datasource.password = ${password}
Пока не повезло. Вероятно, мы не помещаем эти переменные env в нужный класс / папку или используем их неправильно application.properties
.
Ваша помощь высоко ценится!
Спасибо!
Ответы:
Вам не нужно использовать переменные Java. Чтобы включить системные переменные env, добавьте в свой
application.properties
файл следующее:Но путь предложенный @Stefan Isele является более предпочтительным, поскольку в этом случае вы должны объявить только одна переменная ENV:
spring.profiles.active
. Spring автоматически прочитает соответствующий файл свойств поapplication-{profile-name}.properties
шаблону.источник
docker run --name my-tomcat -p 127.0.0.1:8080:8080 -e APP_DB_DB=mydb -e APP_DB_USER=dbuser -e APP_DB_PASS=dbpass --link mongo-myapp:mongo -v /path-to/tomcat/webapps:/usr/local/tomcat/webapps -d tomcat:8-jre8-alpine
spring.activemq.broker-url
то соответствующая переменная окружения будет:SPRING_ACTIVEMQ_BROKER_URL
. точки и тире автоматически преобразуются в подчеркивания. Это чрезвычайно удобно при работе с контейнерами / пружинной загрузкой.Самый простой способ иметь разные конфигурации для разных сред - это использовать пружинные профили. Смотрите внешнюю конфигурацию .
Это дает вам большую гибкость. Я использую это в своих проектах, и это чрезвычайно полезно. В вашем случае у вас будет 3 профиля: 'local', 'jenkins' и 'openshift'
После этого у вас 3 профиля файлы конкретных свойств:
application-local.properties
,application-jenkins.properties
иapplication-openshift.properties
Там вы можете установить свойства для соответствующей среды. Когда вы запускаете приложение, вы должны указать профиль для активации следующим образом:
-Dspring.profiles.active=jenkins
редактировать
Согласно весеннему документу вы можете установить системную переменную среды
SPRING_PROFILES_ACTIVE
для активации профилей и не нужно передавать ее в качестве параметра.Есть ли способ передать параметр активного профиля для веб-приложения во время выполнения?
Нет. Spring определяет активные профили как один из первых шагов при построении контекста приложения. Активные профили затем используются, чтобы решить, какие файлы свойств будут прочитаны и какие компоненты будут созданы. После запуска приложения это нельзя изменить.
источник
application-production.properties
будет развернут на производственном компьютере безопасным способом и обычно не будет находиться в хранилище исходного кода приложения.Это ответ на ряд комментариев, поскольку моя репутация недостаточно высока, чтобы комментировать напрямую.
Вы можете указать профиль во время выполнения, если контекст приложения еще не загружен.
источник
Flayway не распознает прямые переменные среды в application.properties (Spring-Boot V2.1). например
Чтобы решить эту проблему, я сделал переменные окружения, обычно я создаю файл .env:
И экспортируйте переменные в мою среду:
И, наконец, просто запустите команду
Или запустите файл JAR
Здесь есть другой подход: https://docs.spring.io/spring-boot/docs/2.1.0.BUILD-SNAPSHOT/maven-plugin/examples/run-env-variables.html.
источник
Вот фрагмент кода через цепочку файлов свойств среды, загружаемых для разных сред.
Файл свойств под ресурсами вашего приложения ( src / main / resources ): -
В идеале application.properties содержит все общие свойства, которые доступны для всех сред, а свойства, связанные со средой, работают только в определенных средах. поэтому порядок загрузки этих файлов свойств будет таким -
Фрагмент кода здесь: -
источник
Возможно, я пишу это слишком поздно, но у меня возникла аналогичная проблема, когда я пытался переопределить методы для чтения свойств.
Моя проблема была: 1) Чтение свойства из env, если это свойство было установлено в env 2) Чтение свойства из системного свойства, если это свойство было установлено в системном свойстве 3) И, наконец, чтение из свойств приложения.
Итак, для решения этой проблемы я иду в свой класс конфигурации бина
И перезаписать фабрику в @PropertySource. И тогда я создал свою собственную реализацию для чтения свойств.
И создал PropertySourceCustom
Итак, это помогло мне.
источник
Используя Spring context 5.0, я успешно загрузил правильный файл свойств, основанный на системной среде, с помощью следующей аннотации
Здесь значение MYENV считывается из системной среды, и если системная среда отсутствует, будет загружен файл свойств тестовой среды по умолчанию, если я укажу неправильное значение MYENV - приложение не запустится.
Примечание: для каждого профиля вы хотите сохранить - вам нужно будет создать файл application- [profile] .property, и хотя я использовал контекст Spring 5.0, а не загрузку Spring - я считаю, что это также будет работать в Spring 4.1
источник
Я столкнулся с той же проблемой, что и автор вопроса. Для нашего случая ответов на этот вопрос было недостаточно, так как у каждого из членов моей команды была своя локальная среда, и нам определенно требовался
.gitignore
файл, который имел различную строку подключения к базе данных и учетные данные, чтобы люди не передавали общий файл по ошибке и разорвать дБ соединения других.Вдобавок ко всему, когда мы следовали приведенной ниже процедуре, ее было легко развернуть в разных средах, и в качестве дополнительного бонуса нам не нужно было вообще иметь какую-либо конфиденциальную информацию в управлении версиями .
Получение идеи из среды PHP Symfony 3, которая имеет
parameters.yml
(.gitignored) иparameters.yml.dist
(который является примером, который создает первый черезcomposer install
),Я сделал следующее, объединив знания из ответов ниже: https://stackoverflow.com/a/35534970/986160 и https://stackoverflow.com/a/35535138/986160 .
По сути, это дает свободу использовать наследование пружинных конфигураций и выбирать активные профили через верхнюю конфигурацию, а также любые дополнительные конфиденциальные учетные данные следующим образом:
application.yml.dist (образец)
application.yml (.gitignore-d на сервере разработки)
application.yml (.gitignore-d на локальной машине)
application-dev.yml (дополнительные свойства, не зависящие от среды)
То же самое можно сделать с .properties
источник
Если файлы свойств выводятся как переменные среды, в IDE можно добавить следующую конфигурацию запуска:
--spring.config.additional-location={PATH_OF_EXTERNAL_PROP}
источник