我想在不同的上下文路径下在同一个tomcat服务器上部署特定Web应用程序的多个独立副本。每个网络应用程序都需要不同的配置设置(数据库名称,密码等),但我希望保持战争完全相同。
我的计划是让应用程序在启动时找出其上下文路径,然后读取由上下文路径标识的tomcat之外的特定.properties文件。例如,如果将战争部署到{tomcat path} / webapps / pineapple,那么我想阅读/config/pineapple.properties
我一直试图通过spring(3)找到一种注入ServletContext实例的方法,但到目前为止我看到的所有建议都使用了弃用的ServletContextFactoryBean。
是否有更好的方法来注入上下文路径或更好地根据上下文路径加载外部文件?
答案 0 :(得分:5)
在ServletContextAttributeFactoryBean
和Spring EL的帮助下,您可以像这样引用ServletContext init参数(<context-param>
在web.xml中):
#{contextAttributes.myKey}
这允许您使用PropertyPlaceHolderConfigurer
并从用户定义的任意位置加载属性文件:
<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="#{contextParameters.APP_HOME}/conf/app.properties"/>
</bean>
Tomcat的context.xml中的ServletContext init参数的相应定义:
<Parameter name="APP_HOME" value="file:/test" override="false"/>
或者在你的应用的web.xml中:
<context-param>
<param-name>APP_HOME</param-name>
<param-value>file:/test</param-value>
</context-param>
答案 1 :(得分:4)
这应该是解决方案。
<bean name="envConfig" class="EnvironmentConfiguration">
<property name="locations">
<list>
<value>file:///#{servletContext.contextPath}.properties</value>
</list>
</property>
<property name="ignoreUnresolvablePlaceholders" value="true" />
</bean>
答案 2 :(得分:1)
这是我们一直遵循的方法并且效果很好。如果您可以切换到Spring 3.1,那么它支持Environment Profiles,这可能对您有用。