Профиль по умолчанию в Spring 3.1
в моем приложении у меня есть бобы с аннотацией @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"
на всех моих условиях это не вариант.
7 ответов:
мой опыт заключается в том, что с помощью
@Profile("default")
боб будет добавлен в контекст только в том случае, если не будет идентифицирован другой профиль. Если вы проходите в другой профиль, например
-Dspring.profiles.active="demo"
этот профиль игнорируется.
определите свою производственную среду как профиль по умолчанию в вашем интернете.xml
<context-param> <param-name>spring.profiles.default</param-name> <param-value>prod</param-value> </context-param>
и если вы хотите использовать другой профиль, передайте его как системное свойство
mvn -Dspring.profiles.active="demo" jetty:run
У меня та же проблема, но я использую WebApplicationInitializer для того, чтобы настроить ServletContext программно (сервлет 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)); } }
о настройке производственного профиля по умолчанию уже опубликовано @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>
Spring предоставляет два отдельных свойства при определении того, какие профили активны:
spring.profiles.active
и
spring.profiles.default
если
spring.profiles.active
устанавливается, затем его значение определяет, какие профили активны. Но еслиspring.profiles.active
не установлен, то весна смотрит наspring.profiles.default.
, если не
spring.profiles.active
, ниspring.profiles.default
, то есть нет активных профилей, и только те бобы, которые не определены как находясь в профиле создаются.Любой компонент, который не указывает профиль, принадлежитdefault
профиль.
вы можете настроить ваш веб.xml как отфильтрованный ресурс и имеет это значение, заполненное maven из настроек профиля maven-это то, что мы делаем.
в POM фильтровать все ресурсы (вы можете сделать taht, если у вас нет ${} маркировки в них)
<webResources> <resource> <directory>src/main/webapp</directory> <filtering>true</filtering> </resource> </webResources>
в интернете.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