Как установить активные профили spring с профилями maven

у меня есть приложение с maven в качестве инструмента сборки.

Я использую профили Maven для настройки различных свойств из разных профилей.

что я хотел бы сделать, так это то, что все активные профили в maven будут портированы на активные профили spring, чтобы я мог ссылаться на них в подписи bean (@profile). но я не знаю, как это сделать.

например: рассмотрим следующую настройку maven

<profiles>
    <profile>
        <id>profile1</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
        </properties>
    </profile>
    <profile>
        <id>profile2</id>
        <properties>
        </properties>
    </profile>
    <profile>
        <id>development</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
        </properties>
    </profile>
    <profile>
        <id>production</id>
        <properties>    
        </properties>
    </profile>
</profiles>

предполагая, что я запускаю maven без указание любых других профилей, которые я хотел бы для spring иметь profile1 и development как активных профилей.

4 ответов


вам придется фильтровать ресурсы вашего приложения, например файл свойств, который содержит информацию о том, какой профиль активировать весной.

например

spring.profile = ${mySpringProfile}

и для каждого профиля определите значение для этой переменной (mySpringProfile).

во время сборки это будет отфильтровано в соответствии со значением, определенным в текущем активном профиле.

затем во время начальной загрузки приложения вы сможете выбрать присвоил профиль в соответствии с этим файлом (не могу помочь вам больше, как вы не дали нам больше информации, но это довольно легко.

Примечание: я не могу найти способ получить активный профиль в maven (что-то вроде project.профили.active, который содержит ваши значения-P), поэтому вам нужно будет установить новую переменную для каждого профиля.

примечание 2.: если вы используете веб-приложение, вместо использования этого промежуточного файла отфильтруйте это ценность в вашей сети.в XML

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

Примечание 3: это на самом деле плохая практика, и вы должны установить профиль во время выполнения с системным свойством


существует более элегантный способ переключения между 2 профилями Maven + spring одновременно.

первый, добавить профили в POM (обратите внимание-Maven + spring профиль активируется одной системной переменной):

<profiles>
    <profile>
        <id>postgres</id>
        <activation>
            <activeByDefault>true</activeByDefault>
            <property>
                <name>spring.profiles.active</name>
                <value>postgres</value>
            </property>
        </activation>
        <dependencies>
            <dependency>
                <groupId>postgresql</groupId>
                <artifactId>postgresql</artifactId>
                <version>9.1-901.jdbc4</version>
            </dependency>
        </dependencies>
    </profile>
    <profile>
        <id>h2</id>
        <activation>
            <property>
                <name>spring.profiles.active</name>
                <value>h2</value>
            </property>
        </activation>           
        <dependencies>
            <dependency>
                <groupId>com.h2database</groupId>
                <artifactId>h2</artifactId>
                <version>1.4.191</version>
            </dependency>
        </dependencies>
    </profile>
</profiles>

второй, установите профиль по умолчанию для spring (для maven он уже установлен в POM). Для веб-приложения я вставил следующие строки в web.xml:

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

третий добавить профиль-зависимых бобы для вашей конфигурации. В моем случае (XML config) это:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="mainDataSource" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
    </property>
    <property name="jpaProperties" ref="hibProps"/>
    <property name="packagesToScan">
        <list>
            <value>my.test.model</value>
        </list>
    </property>
</bean>
...
<beans profile="postgres">
    <bean name="mainDataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="org.postgresql.Driver" />
        <property name="url" value="jdbc:postgresql://127.0.0.1:5432/webchat" />
        <property name="username" value="postgres" />
        <property name="password" value="postgres" />
    </bean>
</beans>

<beans profile="h2">
    <bean name="mainDataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="org.h2.Driver" />
        <property name="url" value="jdbc:h2:file:./newsdb;INIT=RUNSCRIPT FROM 'classpath:init.sql';TRACE_LEVEL_FILE=0" />
        <property name="username" value="sa" />
        <property name="password" value="" />
    </bean>
</beans>

теперь можно:

  • запустите мое веб-приложение на Postgres DB с помощью mvn jetty:run или mvn jetty:run -Dspring.profiles.active=postgres команды
  • запустите мое веб-приложение на H2 DB с помощью mvn clean jetty:run -Dspring.profiles.active=h2

первое, что вам нужно, это два файла свойств для сохранения ваших конфигураций. Имена файлов должны совпадать с именем приложения шаблона - {custom_suffix}.свойства. Создайте их в каталоге src/main/resources вашего проекта Maven рядом с основным приложением.файл свойств, который вы собираетесь использовать позже для активации одного из других и хранения значений, общих для обоих профилей.

тогда пришло время изменить ваш pom.XML. Вам нужно определить пользовательский свойства в каждом из ваших профилей Maven и установите их значения в соответствии с суффиксами соответствующих файлов свойств, которые вы хотите загрузить с определенным профилем. В следующем примере также отмечен первый профиль для запуска по умолчанию, но он не является обязательным.

<profile>
    <id>dev</id>
    <properties>
        <activatedProperties>dev</activatedProperties>
    </properties>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
</profile>
<profile>
    <id>release</id>
    <properties>
        <activatedProperties>release</activatedProperties>
    </properties>
</profile>

далее, в разделе сборки того же файла, настройте фильтрацию для плагина ресурсов. Это позволит вам вставлять свойства, определенные на предыдущем шаге, в любой файл в каталоге resources, который последующий шаг.

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
    …
</build>

наконец, добавьте следующую строку в приложение.свойства.

spring.profiles.active=@activatedProperties@

при запуске сборки плагин Resources заменит заполнитель значением свойства, определенного в активном профиле Maven. После запуска приложения Spring framework загрузит соответствующий файл конфигурации на основе имени активного профиля Spring, который описывается значением spring.профили.активное свойство. Обратите внимание, что Spring Boot 1.3 заменил синтаксис плагина ресурсов по умолчанию для отфильтрованных значений и использует @activatedProperties@ вместо ${activatedProperties} нотации.

это сработало в совершенстве. Надеюсь, это поможет вам.


В настоящее время я создаю небольшое веб-приложение, которое (по не зависящим от меня причинам) должно быть способно работать на старом сервере/контейнере, который поддерживает только сервлет 2.5 и Java 6. Существует также требование, чтобы конфигурация webapp была полностью автономной, поэтому даже системные переменные и / или параметры JVM не могут использоваться. Администратор просто хочет .файл war для каждой среды, которая может быть удалена в контейнер для развертывания.

Я использую пружину 4.x в мой веб-приложение. Вот как я настроил свое приложение так, чтобы активный профиль Maven использовался для установки активной весны 4.профиль х.


пом.изменения XML-файла

я добавил следующие биты в свой файл POM. Мой POM использует модель версии 4.0.0, и я запускаю Maven 3.1.x, когда я делаю свои сборки.

<modelVersion>4.0.0</modelVersion>

...

<profiles>
    <profile>
        <id>dev</id>
        <activation>
            <!-- Default to dev so we avoid any accidents with prod! :) -->
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <!-- This can be a single value, or a comma-separated list -->
            <spring.profiles.to.activate>dev</spring.profiles.to.activate>
        </properties>
    </profile>
    <profile>
        <id>uat</id>
        <properties>
            <!-- This can be a single value, or a comma-separated list -->
            <spring.profiles.to.activate>uat</spring.profiles.to.activate>
        </properties>
    </profile>
    <profile>
        <id>prod</id>
        <properties>
            <!-- This can be a single value, or a comma-separated list -->
            <spring.profiles.to.activate>prod</spring.profiles.to.activate>
        </properties>
    </profile>
</profiles>

...

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.6</version>
            <configuration>
                <webResources>
                    <webResource>
                        <filtering>true</filtering>
                        <directory>src/main/webapp</directory>
                        <includes>
                            <include>**/web.xml</include>
                        </includes>
                    </webResource>
                </webResources>
                <failOnMissingWebXml>true</failOnMissingWebXml>
            </configuration>
        </plugin>
        ...
    </plugins>
</build>

web.изменения XML-файла

<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Setup for root Spring context
-->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/spring-core-config.xml</param-value>
</context-param>
<!--
Jim Tough - 2016-11-30
Per Spring Framework guide: http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-environment

...profiles may also be activated declaratively through the spring.profiles.active 
property which may be specified through system environment variables, JVM system 
properties, servlet context parameters in web.xml, or even as an entry in JNDI.
-->
<context-param>
    <param-name>spring.profiles.active</param-name>
    <param-value>${spring.profiles.to.activate}</param-value>
</context-param>
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->

Теперь я могу создать конфигурацию на основе Java классы, подобные приведенному ниже, будут использоваться только при активном конкретном профиле пружины.

@Configuration
@Profile({"dev","default"})
@ComponentScan
@EnableTransactionManagement
@EnableSpringDataWebSupport
public class PersistenceContext {
    // ...
}