如何外部化Web应用程序的属性文件(战争)?

时间:2015-10-22 02:14:28

标签: java spring tomcat7 openshift-cartridge

我开发了一个具有jsp和java代码的web应用程序。现在我已将所有键值放入env / lifecycle特定属性文件中(如conf-dev.properties,conf-stg.properties,conf-prod.properties)。

我希望将这些属性文件外部化,以便它可以置于战争之外(不会影响战争)。 现在war文件与属性文件紧密耦合。如果我必须修改我必须构建的任何东西并进行战争和部署。

我在部署服务器计算机上的访问权限非常有限(只能访问我可以放置配置文件的一个文件夹)&部署过程由CI(jenkin&自动脚本)处理。

我在互联网上进行了探索,并了解到我们可以使用spring实现这一目标,想知道实现这一目标的最佳方法是什么?

4 个答案:

答案 0 :(得分:0)

如果我理解你的问题,那么你可以使用Class.getResourceAsStream(String)链接的Javadoc说(部分)

  

此方法委托此对象的类加载器。如果此对象由引导类加载器加载,则该方法委托给ClassLoader.getSystemResourceAsStream(java.lang.String)

答案 1 :(得分:0)

外部化env特定属性的更好方法是使用" user.home"或" user.dir"。

答案 2 :(得分:0)

当你使用Spring时,我想你已经使用了PropertyPlaceholderConfigurer。如果不是,你应该;)

属性文件的位置可以是可以解析为spring Resource的任何内容。这包括classpath,servletcontext以及作为URI的文件引用(file:/// ...对于绝对路径)

https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/beans/factory/config/PropertyPlaceholderConfigurer.html

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="${config.file.location}" />
</bean> 

答案 3 :(得分:0)

谢谢@Martin F ..

已解决:这是我使用过的最后一个,并且在开发环境中工作正常。

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="ignoreUnresolvablePlaceholders" value="false"/> <property name="order" value="1"/> <property name="locations"> <list> <value>classpath:conf-${cisco.life}.properties</value> <value>file:///${openshift.home}/data/conf-${cisco.life}.properties</value> <value>file:${openshift.home}/data/conf-${cisco.life}.properties</value> </list> </property> </bean>

我在openshift中使用了脚本动作钩子来设置系统级别的生命周期。

appname= echo $ OPENSHIFT_APP_NAME case "$appname" in *dev)export JAVA_OPTS_EXT="${JAVA_OPTS_EXT} -Dcisco.life=dev"; echo "setting up env life dev for " $appname ;; *stage)export JAVA_OPTS_EXT="${JAVA_OPTS_EXT} -Dcisco.life=stg; echo "setting up env life as stg for " $appname