spring - Maven 如何控制在测试环境和生产环境之间不同的spring 注入?

  显示原文与译文双语对照的内容
121 2

我在建立一个CI环境,我将把我的网络应用部署到测试环境中。 在这个测试环境中,我希望应用程序使用的业务对象模拟真实的对象;模拟将返回 static 测试数据。 我使用这个来对我的ui运行测试。 我正在控制与 spring的这些业务对象依赖项的注入;它是一个 struts 2应用程序,值得。

我的问题是 Maven 相关的我想。 使用 Maven 构建确定是否为注入模拟或者注入真实事件确定了 spring 配置是什么最好的方法。 这是 Maven 配置文件的好用法? 其他备选方案?

时间: 原作者:

54 1

对于你可以使用上下文参数设置活动配置文件的web应用程序,spring 本身支持概要文件 ( 如果你使用 3.1或者更高版本) 在收费的web.xml 中设置活动的配置文件:


<context-param>


 <param-name>spring.profiles.default</param-name>


 <param-value>test</param-value>


</context-param>



编辑:对于 Maven & Jenkins,你应该能够为生成作业设置参数,如下所示:

首先,让 Maven 通过将以下内容添加到 <build> </build> -tags中的pom.xml 来过滤你的xml资源( 在本例中,只过滤以 xml 结尾的文件,而不过滤其他文件):


 <resources>


 <resource>


 <directory>src/main/webapp</directory>


 <filtering>true</filtering>


 <includes>


 <include>**/*xml</include>


 </includes>


 </resource>


 <resource>


 <directory>src/main/webapp</directory>


 <filtering>false</filtering>


 <excludes>


 <exclude>**/*xml</exclude>


 </excludes>


 </resource>


 </resources> 



然后,参数化你的web.xml 中的上下文参数:


<context-param>


 <param-name>spring.profiles.default</param-name>


 <param-value>${env.SPRINGPROFILE}</param-value>


</context-param>



然后在Jenkins中参数化构建任务,为 SPRINGPROFILE ( 例如测试或者 prod ) 设置所需的字符串参数: https://wiki.jenkins-ci.org/display/JENKINS/Parameterized+Build

原作者:
89 3

使用web应用程序构建( Maven,最佳实践是为多个环境 [prod, test, dev] 生成工件) 可以能是一个不好的主意。? 如果在不同上下文中可以使用不同的注入配置WAR文件,那么WAR工件应该是相同的,每次构建时都是一样的。

为了从WAR中提取配置,我使用 spring 3能力从外部属性文件中提取覆盖值。 我定义默认,换句话说,生产人员,业务对象的值。 我配置 spring 检查是否存在属性文件,当应用程序处于测试环境中并需要模拟注入时,我将部署它。 如果存在该属性文件,则会将它的值改为。 下面是 spring 配置文件的相关位。


<!-- These are the default values -->


 <util:properties id="defaultBeanClasses">


 <prop key="myManagerA">com.myco.ManagerAImpl</prop>


 <prop key="myManagerB">com.myco.ManagerBImpl</prop>


</util:properties>



<!-- Pull in the mock overrides if they exist. -->


<context:property-placeholder 


 location="file:///my/location/mockBeans.properties"


 ignore-resource-not-found="true"


 properties-ref="defaultBeanClasses"/>



<!-- The beans themselves. --> 


<bean id="managerA" class="${myManagerA}"/>


<bean id="managerB" class="${myManagerB}"/>



下面是外部"mockbeans 。属性"file:的内容


#Define mock implementations for core managers


myManagerA=com.myco.ManagerAMockImpl


myManagerB=com.myco.ManagerBMockImpl



如果你愿意,你甚至可以在实际的战斗中包括 mockBeans.properties 文件,但不在实际的位置。 那么测试环境任务将会移动到 spring 配置所指向的位置。 或者,你可以将模拟属性放置在完全不同的项目中。

原作者:
...