我开发了一个具有jsp和java代码的web应用程序。现在我已将所有键值放入env / lifecycle特定属性文件中(如conf-dev.properties,conf-stg.properties,conf-prod.properties)。
我希望将这些属性文件外部化,以便它可以置于战争之外(不会影响战争)。 现在war文件与属性文件紧密耦合。如果我必须修改我必须构建的任何东西并进行战争和部署。
我在部署服务器计算机上的访问权限非常有限(只能访问我可以放置配置文件的一个文件夹)&部署过程由CI(jenkin&自动脚本)处理。
我在互联网上进行了探索,并了解到我们可以使用spring实现这一目标,想知道实现这一目标的最佳方法是什么?
答案 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:/// ...对于绝对路径)
<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
。