Профіль за замовчуванням навесні 3.1


100

У моєму додатку я зазначив, що квасоля зазначається разом із @Profile("prod")та @Profile("demo"). Перший, як ви здогадуєтесь :), використовується на бобах, які підключаються до виробничих БД, а другий коментує боби, які використовують деякі підроблені БД ( HashMapабо що завгодно) - для швидшого розвитку.

Я хотів би мати профіль за замовчуванням ( "prod"), який буде використовуватися завжди, якщо його не перекриє " щось інше ".

Ідеально було б мати в моєму web.xml:

<context-param>
     <param-name>spring.profiles.active</param-name>
     <param-value>prod</param-value>
</context-param>

а потім замініть це, -Dspring.profiles.active="demo"щоб я міг зробити:

mvn jetty:run -Dspring.profiles.active="demo". 

Але, на жаль, це не працює. Будь-яка ідея, як я могла це досягти? Налаштування -Dspring.profiles.active="prod"у всіх моїх середовищах - це не варіант.

Відповіді:


67

Мій досвід - це використання

@Profile("default")

квасоля буде додана в контекст лише тоді, коли не буде визначено іншого профілю. Якщо ви переходите в інший профіль, наприклад -Dspring.profiles.active="demo", цей профіль ігнорується.


4
Прийнята відповідь залежить від web.xml (і це нормально), але ця відповідь працює, чи є у вас web.xml чи ні, і тому загалом корисна для всіх.
Джей

1
це рішення набагато чистіше
cahen

Це офіційна особливість чи якийсь побічний ефект? Чи хотіли б ви посилання на документацію Spring, де описана ця функція?
rustyx

111

Визначте виробниче середовище як профіль за замовчуванням у своєму web.xml

<context-param>
   <param-name>spring.profiles.default</param-name>
   <param-value>prod</param-value>
</context-param>

і якщо ви хочете використовувати інший профіль, передайте його як властивість системи

mvn -Dspring.profiles.active="demo" jetty:run

3
Ні, він намагався визначити активний профіль у web.xml та як властивість системи. У своєму рішенні я конфігурую профіль за замовчуванням у web.xml та перезаписую / визначаю активний профіль через властивість системи. Якщо явного активного профілю немає, буде використано типовий профіль.
andih

1
Дякую! це саме те, що я хотів! не вдалося його знайти десь: /
Michał Margiel

Одна з проблем , з цим підходом: якщо ви встановите spring.profiles.default=prodв application.properties, то application-prod.propertiesне завантажиться. Це контрінтуїтивно.
gamliela

@gamliela Підхід не встановлює профіль за замовчуванням у application.propertiesфайлі. Для того, щоб знати, що application-prod.propertiesслід використовувати, потрібно знати профіль. Ось що і робить цей підхід. Він визначає профілі за межами весняного контексту або web.xml(за замовчуванням) або через змінну середовища (перезаписувати за замовчуванням).
andih

@andih Так, я це знаю, але кажу лише, що це не інтуїтивно та, отже, проблематично. Оскільки application-default.propertiesя завантажуюсь, я також очікую, що application-newdefault.propertiesбуде завантажений також. Це не проблема з вашим рішенням, це проблема з Spring ...
gamliela

6

У мене така ж проблема, але я використовую WebApplicationInitializer для того, щоб програмно налаштувати ServletContext (Servlet 3.0+). Тому я роблю наступне:

public class WebAppInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext sc) throws ServletException {
        // Create the 'root' Spring application context
        final AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
        // Default active profiles can be overridden by the environment variable 'SPRING_PROFILES_ACTIVE'
        rootContext.getEnvironment().setDefaultProfiles("prod");
        rootContext.register(AppConfig.class);

        // Manage the lifecycle of the root application context
        sc.addListener(new ContextLoaderListener(rootContext));
    }
}

5

Ви також можете видалити профіль PROD та скористатися @Profile ("! Demo")


2
Я думаю, це не спрацює, якщо у вас є більше двох профілів, правда?
Чоп

3

Про налаштування виробничого профілю за замовчуванням вже розміщено @andih

Найпростіший спосіб встановити профіль за замовчуванням для додатка Maven jetty - це включити нижче елемент у вашу конфігурацію плагіна:

<plugin>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-maven-plugin</artifactId>
    <configuration>
        <systemProperties>
            <systemProperty>
                <name>spring.profiles.active</name>
                <value>demo</value>
            </systemProperty>
        </systemProperties>
    </configuration>
</plugin>

3

Весна надає два окремих властивості при визначенні того, які профілі активні:

  • spring.profiles.active

і

  • spring.profiles.default

Якщо spring.profiles.activeвстановлено, то його значення визначає, які профілі активні. Але якщо spring.profiles.activeне встановлено, тоді весна виглядаєspring.profiles.default.

Якщо ні встановлено, spring.profiles.activeані spring.profiles.defaultвстановлено, немає активних профілів, і створюються лише ті квасолі, які не визначені як такі, що знаходяться в defaultпрофілі.


-1

Ви можете налаштувати ваш web.xml як відфільтрований ресурс і мати це значення заповнене maven з налаштувань профілю Maven - ось що ми робимо.

у фільтр pom відфільтруйте всі ресурси (ви можете зробити це, якщо у вас немає позначки $ {})

<webResources>
    <resource>
        <directory>src/main/webapp</directory>
        <filtering>true</filtering>
    </resource>
</webResources>

в web.xml поставити

<context-param>
     <param-name>spring.profiles.active</param-name>
     <param-value>${spring.prfile}</param-value>
</context-param>

Пом створити профілі Maven

<profiles>
    <profile>
        <id>DEFAULT</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <spring.profile>prod</spring.profile>
        </properties>
    <profile>
    <profile>
        <id>DEMO</id>
        <properties>
            <spring.profile>demo</spring.profile>
        </properties>
    <profile>
</profiles>

Тепер ви можете використовувати

mvn jetty:run -P DEMO

або просто -P DEMOз будь-якою командою Maven


1
Я не впевнений, але думаю, що це не вийде. IMHO jetty: запуск не буде запускати фазу, в якій ресурси фільтруються.
Michał Margiel

з caurse вам потрібно запустити MVN чистої компіляції причалу: запустити -P DEMO, але з відкомпілювалися кодою він запускає його autimaticly
Hurda

10
Я розумію, що одна з головних цілей профілів Spring 3.1 - генерувати єдиний файл WAR, готовий до розгортання у всіх середовищах. Використання профілів Maven - це крок назад до попереднього стану: там, де упаковка файлу WAR була потрібна для кожного середовища ...
edrabc

@edrabc він просив mvn jetty: run - немає файлу WAR.
Хурда

Погодьтесь @Hurda. Але він також просив запустити команду в декількох середовищах: суміш профілів Maven і Spring Profiles може бути трохи оманливою ...
edrabc
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.