有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何外部化web应用程序(war)的属性文件?

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

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

我对部署服务器计算机的访问权限非常有限(只能访问一个文件夹,我可以在其中放置配置文件)&;部署过程由CI(jenkin&;automated script)处理

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


共 (4) 个答案

  1. # 1 楼答案

    谢谢@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=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

  2. # 2 楼答案

    如果我理解你的问题,那么你可以使用链接的Javadoc所说的^{}(部分)

    This method delegates to this object's class loader. If this object was loaded by the bootstrap class loader, the method delegates to ClassLoader.getSystemResourceAsStream(java.lang.String).

  3. # 3 楼答案

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

  4. # 4 楼答案

    当您使用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>