Вопрос:

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

java spring maven spring-profiles

62587 просмотра

6 ответа

4314 Репутация автора

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

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

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

Автор: Gleeb Источник Размещён: 21.08.2014 07:37

Ответы (6)


21 плюса

4894 Репутация автора

Решение

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

Например

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 : Это на самом деле плохая практика, и вы должны установить профиль во время выполнения с системным свойством

Автор: poussma Размещён: 21.08.2014 09:41

34 плюса

1390 Репутация автора

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

Во-вторых , установите профиль по умолчанию для весны (для 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 с помощью команд mvn jetty:runилиmvn jetty:run -Dspring.profiles.active=postgres
  • Запустите мое веб-приложение на базе данных H2 с помощью mvn clean jetty:run -Dspring.profiles.active=h2
Автор: Eugene Размещён: 24.03.2016 12:20

1 плюс

8402 Репутация автора

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

Я использую Spring 4.x в моем веб-приложении. Так я настроил свое приложение так, чтобы активный профиль 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 {
    // ...
}
Автор: Jim Tough Размещён: 30.11.2016 05:32

20 плюса

705 Репутация автора

Первое, что вам нужно, это два файла свойств для хранения ваших настроек. Имена файлов должны соответствовать шаблону 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.

spring.profiles.active=@activatedProperties@

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

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

Автор: Sergio Sánchez Sánchez Размещён: 22.08.2017 12:15

0 плюса

1040 Репутация автора

Добавьте заполнитель ${activeProfile}в web.xml:

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

Установите свойства в pom.xml для каждого профиля:

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

Добавьте maven-war-pluginи установите <filteringDeploymentDescriptors>true</filteringDeploymentDescriptors>для замены заполнителя при запуске mvn package -Pprofile1или mvn package -Pprofile2:

<build>
  <plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>3.2.2</version>
    <configuration>
      <filteringDeploymentDescriptors>true</filteringDeploymentDescriptors>
    </configuration>
  </plugin>
</build>
Автор: xxg Размещён: 05.03.2019 09:20

0 плюса

50 Репутация автора

Для приложения Spring Boot можно добавить свойство в профиле Maven в, pom.xmlа затем сослаться на это свойство в application.properties.

Добавьте профили Maven pom.xml, например, с помощью свойства spring.profile.from.maven:

<profiles>
    <profile>
        <id>postgres</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <spring.profile.from.maven>postgres</spring.profile.from.maven>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
            </dependency>
            <dependency>
                <groupId>org.postgresql</groupId>
                <artifactId>postgresql</artifactId>
                <scope>runtime</scope>
            </dependency>
        </dependencies>
    </profile>
    <profile>
        <id>noDb</id>
        <properties>
            <spring.profile.from.maven>noDb</spring.profile.from.maven>
        </properties>
    </profile>
</profiles>

Ссылка на недвижимость Maven в application.properties:

spring.profiles.include=@spring.profile.from.maven@

При такой настройке запуск maven с postgresпрофилем Maven или без профиля добавляет профиль postgresSpring в список активных профилей Spring, а запуск maven с noDbпрофилем Maven добавляет noDbпрофиль Spring в список активных профилей Spring.

Автор: Sayadi Размещён: 11.08.2019 08:29
Вопросы из категории :
32x32