2012-04-06 4 views
91

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

То, что я хотел бы иметь по умолчанию профиль ("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" во всех моих средах не является вариантом.

ответ

57

Мой опыт показывает, что использование

@Profile("default") 

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

+4

Принимаемый ответ зависит от web.xml (и все в порядке), но этот ответ работает независимо от того, у вас есть web.xml или нет, и поэтому он более полезен для всех. – Jay

+1

это решение намного чище – cahen

+0

Это официальная функция или какой-то побочный эффект? Хотите ссылку на документацию Spring, где описывается эта функция? – rustyx

108

Определить производственную среду в качестве профиля по умолчанию в вашем 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 и переписываю/определяю профиль * active * через системное свойство. Если нет активного * активного * профиля, будет использоваться значение по умолчанию. – andih

+0

Спасибо! это именно то, что я хотел! не удалось найти в любом месте:/ –

+0

Одна из проблем с этим подходом: если вы установите 'spring.profiles.default = prod' в' application.properties', то 'application-prod.properties' не будет загружаться. Это противоречит интуиции. – gamliela

-1

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

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

<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: run не будет запускать фазу, в которой ресурсы фильтруются. –

+0

caurse вам нужно запустить mvn clean compile jetty: run -P DEMO, но с незакомпилированным кодом он запускает его автоматически – Hurda

+10

Я понимаю, что одной из главных целей Spring 3.1 Profiles является создание единого файла WAR, готового для развертывания в во всех средах. Использование профилей Maven - это шаг назад к предыдущему состоянию: где требуется упаковка WAR-файла для каждой среды ... – edrabc

3

О настройке профиля производства по умолчанию уже отправил @andih

Самый простой способ установить профиль по умолчанию для Maven молы плагин, чтобы включить ниже элемента в конфигурации плагина:

<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> 
5

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

+2

Я полагаю, это не сработает, если у вас будет более двух профилей, верно? – Chop

5

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

Spring обеспечивают два отдельных свойств при определении профили, которые являются активными:

  • spring.profiles.active

и

  • spring.profiles.default

Если spring.profiles.active установлена, то ее значение определяет, какие профили являются активными. Но если spring.profiles.active не установлен, то Spring выглядит spring.profiles.default.

Если ни spring.profiles.active, ни spring.profiles.default установлен, то нет никаких активных профилей, и только те бобы, которые не определены как в профиле created.Any bean, который не задает профиль, принадлежит профилю default.

Смежные вопросы