Профиль по умолчанию в Spring 3.1

В моем приложении у меня beans аннотируется с @Profile("prod") и @Profile("demo"). Первый, как вы можете догадаться:), используется на beans, который подключается к производственной БД, а второй аннотирует beans, которые используют некоторые поддельные DB (HashMap или что-то еще) - для ускорения разработки.

То, что я хотел бы иметь, - это профиль по умолчанию ("prod"), который будет использоваться всегда, если он не переопределяется "something-else".

Идеально было бы иметь в моем 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" во всех моих средах не является вариантом.

Ответ 1

Мой опыт в том, что с помощью

@Profile("default")

bean будет добавлен только в контекст, если другой профиль не идентифицирован. Если вы передаете другой профиль, например. -Dspring.profiles.active="demo", этот профиль игнорируется.

Ответ 2

Определите свою производственную среду в качестве профиля по умолчанию в вашем 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

Вы также можете рассмотреть удаление профиля PROD и использовать @Profile ( "! demo" )

Ответ 4

У меня такая же проблема, но я использую 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

О настройке профиля профиля по умолчанию, уже опубликованного @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>

Ответ 6

Spring предоставляют два отдельных свойства при определении того, какие профили активны: 1) spring.profiles.active а также 2) spring.profiles.default. Если установлено spring.profiles.active, то его значение определяет, какие профили активны. Но если spring.profiles.active isnt установлен, тогда Spring выглядит как spring.profiles.default. Если не установлено ни spring.profiles.active, ни spring.profiles.default, тогда не являются активными профилями, и только те beans, которые arent определены как находящиеся в профиле, созданы. Любой bean, который не указывает, что профиль принадлежит профилю по умолчанию.

Ответ 7

Вы можете настроить свой web.xml в качестве отфильтрованного ресурса и получить это значение, заполненное maven из настроек профиля maven, - это то, что мы делаем.

в pom фильтровать все ресурсы (вы можете сделать taht, если у вас нет метки ${} в них)

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

в web.xml put

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

в pom создавать профили 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