一尘不染

如何使用Maven配置文件设置Spring Active配置文件

spring

我有一个使用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作为活动配置文件。


阅读 660

收藏
2020-04-15

共2个答案

一尘不染

你必须过滤应用程序的资源,例如属性文件,其中包含要在spring激活的配置文件的信息。

例如

spring.profile = ${mySpringProfile}

并为每个配置文件定义此变量的值(mySpringProfile)。

在构建期间,将根据当前活动配置文件中定义的值对其进行过滤。

然后,在应用程序的引导过程中,你将根据该文件选择适当的配置文件(由于你没有向我们提供更多信息,因此无法为你提供更多帮助,但这很容易。

注意:我找不到在maven中获取当前活动配置文件的方法(类似于project.profiles.active,其中包含你的-P值),这就是为什么你必须为每个配置文件设置新变量的原因。

注意2:如果你正在运行Web应用程序,则不要使用此中间文件,而应在web.xml中过滤该值

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

注意3:这实际上是一种不好的做法,你应该在运行时使用系统属性设置配置文件

2020-04-15
一尘不染

有一种更优雅的方式可以同时在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应用程序,我将以下行插入到web.xml:

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

第三,将配置文件相关的bean添加到您的配置中。就我而言(XML配置),它是:

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

现在可以:

  • 使用mvn jetty:run或mvn jetty:run -Dspring.profiles.active=postgres命令在Postgres DB上运行我的Web应用
  • 使用H2 DB运行我的Web应用程序 mvn clean jetty:run -Dspring.profiles.active=h2
2020-04-15