0

我开发了一个包含 jsp 和 java 代码的 web 应用程序。现在,我已将所有键值对放入一个特定于环境/生命周期的属性文件(如 conf-dev.properties、conf-stg.properties、conf-prod.properties)。

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

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

我在互联网上探索并知道我们可以使用弹簧来实现这一点,想知道实现这一目标的最佳方法是什么?

4

4 回答 4

0

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

属性文件的位置可以是任何可以解析为 spring 的位置Resource。这包括类路径、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> 
于 2015-10-22T05:17:29.407 回答
0

将环境特定属性外部化的更好方法是使用“user.home”或“user.dir”。

于 2015-10-22T04:22:50.650 回答
0

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

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

于 2015-10-22T02:22:39.613 回答
0

谢谢@Martin F..

已解决:这是我使用的最后一个,它在 dev、stage Env 中运行良好。

<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=回声 $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

于 2015-10-25T18:33:48.193 回答