Подтвердить что ты не робот

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

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

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

Что бы я хотел сделать, так это то, что все активные профили в maven будут портироваться в активные профили spring, поэтому я могу ссылаться на них в bean signature (@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 в качестве активных профилей.

4b9b3361

Ответ 1

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

Например

spring.profile = ${mySpringProfile}

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

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

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

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

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

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

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

Ответ 2

Существует более элегантный способ одновременного переключения между 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>

Третий, добавьте зависящий от профиля beans в вашу конфигурацию. В моем случае (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>

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

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

Ответ 3

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

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


изменения файла pom.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, подобные приведенным ниже, которые будут использоваться только при активном профиле Spring.

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

Ответ 4

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

Затем пришло время изменить ваш 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>

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

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

Наконец, добавьте следующую строку в application.properties.

[email protected]@

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

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