在运行时覆盖Spring WebApp中的属性文件

时间:2015-10-17 09:08:53

标签: java spring spring-mvc tomcat properties-file

我使用WebApplication在我的Spring PropertyPlaceholderConfigurer中加载属性文件,如下所示:

<bean
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:db.properties</value>
                <value>classpath:mail.properties</value>
            </list>
        </property>
    </bean>

现在,我想覆盖mail.properties中的一些属性,因此我在application-context文件中创建了一个额外的条目,读取此post,如下所示:

<context:property-placeholder location="file:override.properties"
        order="-1" ignore-unresolvable="true" ignore-resource-not-found="true" />

然后,在我的 Tomcat Server 中,在VM Arguments的启动配置中,我提供了额外的条目:

-Dexternal.props="/Users/ArpitAggarwal/Desktop/override.properties"

我必须覆盖某些键的重写值。

但是,WebApp 没有从<{1}}中获取值。任何人都可以帮助我弄清楚我错过了什么。

任何帮助将不胜感激。谢谢!

3 个答案:

答案 0 :(得分:1)

我为解决此问题所做的工作是将location属性替换为${ext.properties.dir:classpath:}/override.properties,如下所示:

<context:property-placeholder
        location="${ext.properties.dir:classpath:}/override.properties" order="-1"
        ignore-unresolvable="true" ignore-resource-not-found="true" />

ext.properties.dir提供的application-server/jvm值为:

-Dext.properties.dir=file:/Users/ArpitAggarwal/properties/

参考6-tips-for-managing-property-files-with-spring

答案 1 :(得分:0)

我认为使用多个propertyPlaceholders不是一个goog的想法。 当两个xml配置在相同的上下文中加载每个属性并尝试交叉使用它时,我遇到了很多问题。

如果要外部化属性文件,我建议使用JNDI属性:

<bean
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>classpath:db.properties</value>
            <value>classpath:mail.properties</value>
            <value>${java:com/env/myApp/externalProperties}
        </list>
    </property>
</bean>

这个JNDI的值是:&#34; file:/ path-to-propertiesFile&#34;。

通过这种方式,您只需要一个propertyePlaceholder。 另请注意,通过将外部文件作为最后一个位置,如果您有重复的键,spring将仅保留最后一个。

答案 2 :(得分:0)

您只需在应用程序上下文中使用

<context:property-placeholder location="file:///${external.props}"
    order="-1" ignore-unresolvable="true" ignore-resource-not-found="true" />

问题是你只是错误地使用了位置,实际位置是vm arg variable key =&gt; $ {external.props}