Java WebSphere和PropertyPlaceHolderConfiguration

Java WebSphere和PropertyPlaceHolderConfiguration,java,spring,websphere,Java,Spring,Websphere,我是一个属性的大用户(使用PropertyPlaceHolderConfigure),以使我的应用程序尽可能“动态”。几乎所有的常数都是这样定义的。无论如何,我目前正在定义默认WAR附带的default.properties 在其他环境(验收/生产)中,我需要覆盖配置。我是这样做的: <bean id="propertyManager" class="org.springframework.beans.factory.config.PropertyPlaceholderCo

我是一个属性的大用户(使用PropertyPlaceHolderConfigure),以使我的应用程序尽可能“动态”。几乎所有的常数都是这样定义的。无论如何,我目前正在定义默认WAR附带的
default.properties

在其他环境(验收/生产)中,我需要覆盖配置。我是这样做的:

<bean id="propertyManager"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:com/company/default.properties</value>
                <value>file:${COMPANY_PROPERTIES_LOCATION}\kbo-select-settings.properties</value>
            </list>
        </property>
    </bean>
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" />

类路径:com/company/default.properties
文件:${COMPANY\u PROPERTIES\u LOCATION}\kbo-select-settings.PROPERTIES
这意味着我可以为每个环境使用可升级的构建

但是,我不喜欢不能从WebSphere内部更改任何属性的事实。相反,我必须转到每个服务器(我们有8个集群服务器)并相应地更改属性。如果我可以在WebSphere内部更改这些内容,然后执行重新启动,那么它将更加友好

有人知道我怎么能做这样一个可升级的构建吗?我已经为datasources/javamail/etc定义了JNDI配置


谢谢

如果配置在EAR文件中,那么我知道没有简单的方法可以在没有后门欺骗或重新部署应用程序的情况下发布更改

我认为这种配置,特别是在推广应用程序时发生的更改,不应该出现在应用程序中

一种方法由Keys Botzum描述

请注意,您实际上可以使用标准WebSphere同步将不属于任何特定应用程序的文件分发给节点


另一个选项是使用数据库进行配置。如今,将XML放入DB2之类的数据库并不难。

我们通过在每个环境(本地、开发、int、tst…)的属性文件上使用扩展名解决了这个问题,每个文件都包含这些环境的特定值。然后,您需要的唯一添加是服务器上的一个VM参数,用于设置-Druntime.env=X

您在配置文件中的查找将如下所示

<bean id="propertyManager"
 class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
       <list>
          <value>classpath:com/company/default.properties.${runtime.env}</value>
          <value>file:${COMPANY_PROPERTIES_LOCATION}\kbo-select-settings.properties</value>
        </list>
    </property>
 </bean>

classpath:com/company/default.properties.${runtime.env}
文件:${COMPANY\u PROPERTIES\u LOCATION}\kbo-select-settings.PROPERTIES

当然,这只有在您拥有相当静态的环境时才有效,因为它仍然不适合在运行时更改它,但它确实使应用程序的升级变得非常简单。如果希望能够在不重新部署应用程序的情况下更改值,则必须将其存储在应用程序外部,您似乎已经在为kbo select settings.properties添加指向websphere服务器配置文件的URL资源,然后在应用程序中查找该资源,这是一种可行的方法。然后,您可以将url配置为指向管理所有配置文件的中心位置-如果您使用svn并且您的svn具有只读访问权限,您甚至可以直接从svn(通过http)读取它们

Spring有一些内置的工具来实现这一点,这也意味着您可以使用各种配置文件


有关更多信息,请查看我处理此问题的方法是在JVM上使用属性值,然后将它们引用到在集群或单元级别定义的WebSphere变量。例如,假设您希望在spring配置的param1中设置一个名为value1的值,您可以执行以下操作:

<bean id="propertyManager"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:com/company/default.properties</value>
                <value>file:${COMPANY_PROPERTIES_LOCATION}\kbo-select-settings.properties</value>
            </list>
        </property>
    </bean>
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" />
然后,在websphere配置中,如果创建JVM变量并将其链接到websphere变量,则只需更改websphere变量,它就会自动更新每台机器上的所有JVM变量

为此,请创建一个名为:

参数1

值为${webspherevar.param1}

然后创建一个名为:

webspherevar.param1

它包含您需要输入的任何值。这样,您就不必为每个环境发送值,而是可以将它们加载到环境中并使用


我希望这会有所帮助。

一个潜在的问题是您正在对属性文件的位置进行硬编码。您可以将属性文件的位置指定为JNDI资源,并使用类路径上指定的默认值:

<!--  try to lookup the configuration from a URL, if that doesn't work, fall back to the properties on the classpath -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location">
        <bean class="org.springframework.core.io.UrlResource">
            <constructor-arg>
                <jee:jndi-lookup 
                    jndi-name="url/config" 
                    default-value="file:///tmp" /> <!--  dummy default value ensures that the URL lookup doesn't fall over if the JNDI resource isn't defined -->
            </constructor-arg>
        </bean>
    </property>
    <property name="properties">
        <bean class="org.springframework.beans.factory.config.PropertiesFactoryBean">
            <property name="locations">
                <list>
                    <value>classpath:com/company/default.properties</value>
                </list>
            </property>
        </bean>
    </property>
    <property name="ignoreResourceNotFound" value="true"/> 
</bean>

类路径:com/company/default.properties
通过这种方式,您可以在Resources>URL>URL中使用WAS控制台为不同的环境指定不同的文件名,方法是创建一个JNDI名称为“URL/config”的资源,并将其指向正确的文件(file:///your/path/to/properties)

作为替代解决方案,如果您希望通过控制台管理单个属性,您可以使用jee:jndi查找从web.xml env条目(您可以使用WAS控制台管理)获取值,而不是使用PropertyPlaceHolderConfigure。看