Як встановити профіль Spring із системної змінної?


81

У мене є проект Spring, який використовує інший проект. Кожен проект має власний весняний профіль, який ініціалізується з коду Java, використовуючи applicationContext.xmlі *.propertiesдля кожного профілю. Я ввожу профіль з args[]. Проблема полягає в тому, що другий проект використовує конфігурацію за замовчуванням для env, тому що applicationContext.xml я не можу ввести env args[]до другого проекту, і я спробував знайти статтю, яка пояснить, як працює профіль Spring.

  1. Чи існує ієрархія, на якій він буде виглядати у профілі, якщо типово не налаштовано applicationContext.xml?
  2. Чи System var сильніший за applicationContext.xmlконфігурацію?
  3. Що, на вашу думку, є найкращим рішенням мого виклику?

Статті на цю тему чи навіть приклади були б дуже вдячні !! Заздалегідь спасибі.

Відповіді:


133

SPRING_PROFILES_ACTIVE - це змінна середовища для заміни / вибору профілю Spring


Поряд з Docker також добре працює з бібліотекою конфігурації TypeSafe (HOCON), сценарієм оболонки для ініціалізації програми / системи / контейнера Docker тощо
Lalit Jha


63

Якщо ви надаєте свій JVM профіль Spring, проблем не повинно виникнути:

java -Dspring.profiles.active=development -jar yourApplication.jar 

Також див. Весняна документація:

http://docs.spring.io/spring-boot/docs/current/reference/html/howto-properties-and-configuration.html

69.5 Встановіть активні профілі Spring

Spring Spring має API для цього, але зазвичай ви встановлюєте властивість System (spring.profiles.active) або змінну середовища ОС (SPRING_PROFILES_ACTIVE). Наприклад, запустіть свою програму з аргументом -D (не забудьте поставити її перед основним класом або архівом jar):

$ java -jar -Dspring.profiles.active = виробнича демонстрація-0.0.1-SNAPSHOT.jar

У Spring Boot ви також можете встановити активний профіль у application.properties, наприклад

spring.profiles.active = виробництво

Значення, встановлене таким чином, замінюється властивістю System або змінною середовища, але не методом SpringApplicationBuilder.profiles (). Таким чином, останній Java API можна використовувати для збільшення профілів без зміни типових значень.

Для отримання додаткової інформації див. Розділ 25, Профілі в розділі „Функції Spring Boot”.


40

Я зазвичай налаштовую applicationContext, використовуючи конфігурацію на основі анотацій, а не конфігурацію на основі XML . У будь-якому випадку, я вважаю, що вони обидва мають однаковий пріоритет .

* Відповідаючи на ваше запитання, системна змінна має вищий пріоритет *


Отримання компонентів на основі профілю з applicationContext

  • Використовуйте @Profile на Bean

@Component
@Profile("dev")
public class DatasourceConfigForDev

Тепер профіль є dev

Примітка: якщо Профіль вказано так, @Profile("!dev")тоді профіль виключить розробник і буде для всіх інших.

  • Використовуйте атрибут профілі в XML

<beans profile="dev">
    <bean id="DatasourceConfigForDev" class="org.skoolguy.profiles.DatasourceConfigForDev"/>
</beans>

Встановіть значення для профілю:

  • Програмно через інтерфейс WebApplicationInitializer

    У веб-додатках WebApplicationInitializer можна використовувати для програмної конфігурації ServletContext
@Configuration
public class MyWebApplicationInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
            servletContext.setInitParameter("spring.profiles.active", "dev");
    }
}
  • Програмно через ConfigurableEnvironment

    Ви також можете встановити профілі безпосередньо в середовищі:
    @Autowired
    private ConfigurableEnvironment env;

    // ...

    env.setActiveProfiles("dev");
  • Параметр контексту в web.xml

    профілі також можна активувати в web.xml веб-програми, використовуючи параметр контексту:
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/app-config.xml</param-value>
    </context-param>
    <context-param>
        <param-name>spring.profiles.active</param-name>
        <param-value>dev</param-value>
    </context-param>
  • Параметр системи JVM

    Імена профілів, передані як параметр, будуть активовані під час запуску програми:

    -Dspring.profiles.active=dev
    

    В середовищах IDE ви можете встановити змінні та значення середовища для використання під час запуску програми. Нижче наведено конфігурацію запуску в Eclipse:

Eclipse Run Configuration - знімок екрана недоступний

  • Змінна середовища

    встановити через командний рядок: export spring_profiles_active=dev

Будь-який компонент, який не вказує профіль, належить до профілю “за замовчуванням”.


Пріоритетним порядком є:

  1. Параметр контексту в web.xml
  2. WebApplicationInitializer
  3. Параметр системи JVM
  4. Змінна середовища

бездоганна відповідь!
Gaurav,

6

Якщо ви використовуєте docker для розгортання програми весняного завантаження, ви можете встановити профіль за допомогою прапорця e :

запуск докера -e "SPRING_PROFILES_ACTIVE = prod" -p 8080: 8080 -t r.test.co/myapp:latest


як цей прапор використовувався внутрішньо навесні.
Пармар Камлеш

1

Моє рішення - встановити змінну середовища як spring.profiles.active=development. Таким чином, всі програми, що працюють на цій машині, посилатимуться на змінну та запускатимуть програму. Порядок, в якому пружина завантажує властивості, наступний

application.properties
system properties
environment variable

1

Якщо я запускаю командний рядок: java -Dspring.profiles.active=development -jar yourApplication.jar у моєму каталозі веб-додатків там зазначено, що шлях неправильний. Тож я просто визначив профіль вручну у файлі application.properties таким чином:

spring.profiles.active=mysql 

або

spring.profiles.active=postgres

або

spring.profiles.active=mongodb

1

Ви можете встановити профіль пружини, постачаючи -Dspring.profiles.active=<env>

Для файлів Java у вихідному каталозі (src) ви можете використовувати до System.getProperty("spring.profiles.active")

Для файлів Java у тестовому каталозі ви можете надати

  • SPRING_PROFILES_ACTIVE до <env>

АБО

Оскільки "середовище", "jvmArgs" та "systemProperties" ігноруються для завдання "тест". У root build.gradleдодайте завдання для встановлення властивості jvm та змінної середовища.

test {
    def profile = System.properties["spring.profiles.active"]
    systemProperty "spring.profiles.active",profile
    environment "SPRING.PROFILES_ACTIVE", profile
    println "Running ${project} tests with profile: ${profile}"
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.