我有一个使用maven作为构建工具的应用程序。
我正在使用Maven配置文件从不同的配置文件设置不同的属性。
我想做的是将maven中的所有活动配置文件也移植到spring活动配置文件中,以便我可以在bean签名(@profile)中引用它们。但是我不确定该怎么做。
@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作为活动配置文件。
profile1
你必须过滤应用程序的资源,例如属性文件,其中包含要在spring激活的配置文件的信息。
例如
spring.profile = ${mySpringProfile}
并为每个配置文件定义此变量的值(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:这实际上是一种不好的做法,你应该在运行时使用系统属性设置配置文件
有一种更优雅的方式可以同时在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 clean jetty:run -Dspring.profiles.active=h2